Feature Tip: Add private address tag to any address under My Name Tag !
ERC-1155
Overview
Max Total Supply
474 DBFP
Holders
362
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
FoundersPass
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-08-18 */ // SPDX-License-Identifier: MIT /** _____ _ ____ | ___|__ _ _ _ __ __| | ___ _ __ ___| _ \ __ _ ___ ___ | |_ / _ \| | | | '_ \ / _` |/ _ \ '__/ __| |_) / _` / __/ __| | _| (_) | |_| | | | | (_| | __/ | \__ \ __/ (_| \__ \__ \ |_| \___/ \__,_|_| |_|\__,_|\___|_| |___/_| \__,_|___/___/ */ pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` fo r some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/IERC1155Receiver.sol pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** @dev Handles the receipt of a single ERC1155 token type. This function is called at the end of a `safeTransferFrom` after the balance has been updated. To accept the transfer, this must return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` (i.e. 0xf23a6e61, or its own function selector). @param operator The address which initiated the transfer (i.e. msg.sender) @param from The address which previously owned the token @param id The ID of the token being transferred @param value The amount of tokens being transferred @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** @dev Handles the receipt of a multiple ERC1155 token types. This function is called at the end of a `safeBatchTransferFrom` after the balances have been updated. To accept the transfer(s), this must return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` (i.e. 0xbc197c81, or its own function selector). @param operator The address which initiated the batch transfer (i.e. msg.sender) @param from The address which previously owned the token @param ids An array containing ids of each token being transferred (order and length must match values array) @param values An array containing amounts of each token being transferred (order and length must match ids array) @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/IERC1155.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol pragma solidity ^0.8.0; /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/ERC1155.sol pragma solidity ^0.8.0; /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ constructor(string memory uri_) { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: balance query for the zero address"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not owner nor approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: transfer caller is not owner nor approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn( address from, uint256 id, uint256 amount ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), ""); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver.onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155Receiver.onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } } pragma solidity ^0.8.0; contract FoundersPass is ERC1155, Ownable { uint256 PLATINUM = 0; uint256 GOLD = 1; uint256 SILVER = 2; string public name = "DANKBOTS Founders Pass"; string public symbol = "DBFP"; mapping( uint => string ) public tokenURI; mapping( uint => uint ) public maxSupply; mapping( uint => uint ) public totalSupply; mapping( uint => bool ) public paused; mapping( uint => bytes32 ) public merkleRoot; mapping( address => bool ) public claimed; constructor() ERC1155("") { maxSupply[ PLATINUM ] = 150; maxSupply[ GOLD ] = 500; maxSupply[ SILVER ] = 1500; totalSupply[ PLATINUM ] = 0; totalSupply[ GOLD ] = 0; totalSupply[ SILVER ] = 0; merkleRoot[ PLATINUM ] = 0x6c4d5a5092dad726cab2fd5b1f4b0720f87a42bde0bcd8053786b30331197226; merkleRoot[ GOLD ] = 0xed6c5004597908fc4ab0534bf54d52bccfa4432fda29f0da4443ead07f770f51; merkleRoot[ SILVER ] = 0x65a8be9fe46cda3439452a46d2fbca79065065b7eb45fb6fd612a010f8c026ff; tokenURI[ PLATINUM ] = "data:application/json;base64,eyJpbWFnZSI6ICJpcGZzOi8vUW1ZeGRLbkJ4eXNSZW5jR0QzcXBwS1NlVUI1M3ZMNDRyWUJLWW9yU3J5NWt4VC9QbGF0aW51bV9Gb3VuZGVycy5tcDQiLCAibmFtZSI6ICJEQU5LQk9UUyBQbGF0aW51bSBGb3VuZGVycyBQYXNzIiwgInRva2VuSWQiOiAwLCAiYXR0cmlidXRlcyI6IFt7InRyYWl0X3R5cGUiOiAibWVtYmVyc2hpcCB0aWVyIiwgInZhbHVlIjogIlBsYXRpbnVtIn0sIHsidHJhaXRfdHlwZSI6ICJhcnRpc3QiLCAidmFsdWUiOiAiQ2VtIFRlemNhbiJ9LCB7InRyYWl0X3R5cGUiOiAibXVzaWMiLCAidmFsdWUiOiAiRE5LQlRTIFRIRU1FIC8vIE1yLiBPaXpvIn1dfQ=="; tokenURI[ GOLD ] = "data:application/json;base64,eyJpbWFnZSI6ICJpcGZzOi8vUW1ZeGRLbkJ4eXNSZW5jR0QzcXBwS1NlVUI1M3ZMNDRyWUJLWW9yU3J5NWt4VC9Hb2xkX0ZvdW5kZXJzLm1wNCIsICJuYW1lIjogIkRBTktCT1RTIEdvbGQgRm91bmRlcnMgUGFzcyIsICJ0b2tlbklkIjogMSwgImF0dHJpYnV0ZXMiOiBbeyJ0cmFpdF90eXBlIjogIm1lbWJlcnNoaXAgdGllciIsICJ2YWx1ZSI6ICJHb2xkIn0sIHsidHJhaXRfdHlwZSI6ICJhcnRpc3QiLCAidmFsdWUiOiAiQ2VtIFRlemNhbiJ9LCB7InRyYWl0X3R5cGUiOiAibXVzaWMiLCAidmFsdWUiOiAiRE5LQlRTIEJPUCAvLyBNci4gT2l6byJ9XX0="; tokenURI[ SILVER ] = "data:application/json;base64,eyJpbWFnZSI6ICJpcGZzOi8vUW1ZeGRLbkJ4eXNSZW5jR0QzcXBwS1NlVUI1M3ZMNDRyWUJLWW9yU3J5NWt4VC9TaWx2ZXJfRm91bmRlcnMubXA0IiwgIm5hbWUiOiAiREFOS0JPVFMgU2lsdmVyIEZvdW5kZXJzIFBhc3MiLCAidG9rZW5JZCI6IDIsICJhdHRyaWJ1dGVzIjogW3sidHJhaXRfdHlwZSI6ICJtZW1iZXJzaGlwIHRpZXIiLCAidmFsdWUiOiAiU2lsdmVyIn0sIHsidHJhaXRfdHlwZSI6ICJhcnRpc3QiLCAidmFsdWUiOiAiQ2VtIFRlemNhbiJ9LCB7InRyYWl0X3R5cGUiOiAibXVzaWMiLCAidmFsdWUiOiAiRE5LQlRTIEdST09WRSAvLyBDb2NvIE1hZ251c3NvbiJ9XX0="; } function setTokenURI( uint _id, string memory _uri ) external onlyOwner { tokenURI[_id] = _uri; emit URI( _uri, _id ); } function uri( uint _id ) public override view returns ( string memory ) { return tokenURI[ _id ]; } function setMaxSupply( uint _id, uint256 _maxSupply ) external onlyOwner { maxSupply[ _id ] = _maxSupply; } function setPaused( uint _id, bool _paused ) external onlyOwner { paused[ _id ] = _paused; } function setMerkleRoot( uint _id, bytes32 _root ) external onlyOwner { merkleRoot[ _id ] = _root; } function mint(address _to, uint _id, uint _amount) external onlyOwner { require( _id >= 0, "Invalid token id" ); require( totalSupply[ _id ] + _amount <= maxSupply[ _id ], "Max mint limit reached!" ); _mint( _to, _id, _amount, "" ); totalSupply[ _id ] += _amount; } function mintPublic( bytes32[] calldata _merkleProof, uint256 _id ) public payable { require( _id >= 0, "Invalid token id" ); require( ! paused[ _id ], "Cannot mint while paused" ); require( totalSupply[ _id ] + 1 <= maxSupply[ _id ], "Max mint limit reached!" ); require( ! claimed[ msg.sender ], "Address has already claimed!" ); if ( msg.sender != owner() ) { bytes32 leaf = keccak256( abi.encodePacked( msg.sender ) ); require( MerkleProof.verify( _merkleProof, merkleRoot[ _id ], leaf ), "Invalid proof" ); } _mint( msg.sender, _id, 1, "" ); claimed[ msg.sender ] = true; totalSupply[ _id ] += 1; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"mintPublic","outputs":[],"stateMutability":"payable","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":"","type":"uint256"}],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"}],"name":"setTokenURI","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":"","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60006004556001600555600260065560c0604052601660808190527f44414e4b424f545320466f756e6465727320506173730000000000000000000060a09081526200004f9160079190620002d0565b50604080518082019091526004808252630444246560e41b60209092019182526200007d91600891620002d0565b503480156200008b57600080fd5b50604080516020810190915260008152620000a68162000265565b50620000b2336200027e565b600480546000908152600a60209081526040808320609690556005805484528184206101f490556006805485528285206105dc905585548552600b8452828520859055815485528285208590558054855282852085905594548452600d83528184207f6c4d5a5092dad726cab2fd5b1f4b0720f87a42bde0bcd8053786b3033119722690555483528083207fed6c5004597908fc4ab0534bf54d52bccfa4432fda29f0da4443ead07f770f51905592548252908290207f65a8be9fe46cda3439452a46d2fbca79065065b7eb45fb6fd612a010f8c026ff9055815161020081019092526101d5808352906200290f908301396009600060045481526020019081526020016000209080519060200190620001ce929190620002d0565b506040518061020001604052806101c18152602001620025796101c19139600960006005548152602001908152602001600020908051906020019062000216929190620002d0565b506040518061020001604052806101d581526020016200273a6101d5913960096000600654815260200190815260200160002090805190602001906200025e929190620002d0565b50620003b3565b80516200027a906002906020840190620002d0565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620002de9062000376565b90600052602060002090601f0160209004810192826200030257600085556200034d565b82601f106200031d57805160ff19168380011785556200034d565b828001600101855582156200034d579182015b828111156200034d57825182559160200191906001019062000330565b506200035b9291506200035f565b5090565b5b808211156200035b576000815560010162000360565b600181811c908216806200038b57607f821691505b60208210811415620003ad57634e487b7160e01b600052602260045260246000fd5b50919050565b6121b680620003c36000396000f3fe6080604052600436106101645760003560e01c806370b9e991116100d1578063bd85b0391161008a578063daff97b511610064578063daff97b514610469578063e985e9c514610489578063f242432a146104d2578063f2fde38b146104f257600080fd5b8063bd85b039146103ec578063c87b56dd14610419578063c884ef831461043957600080fd5b806370b9e9911461033a578063715018a61461034d578063869f7594146103625780638da5cb5b1461038f57806395d89b41146103b7578063a22cb465146103cc57600080fd5b8063162094c411610123578063162094c41461026057806318712c21146102805780632eb2c2d6146102a057806337da577c146102c05780633c70b357146102e05780634e1273f41461030d57600080fd5b8062dde10e14610169578062fdd58e146101ae57806301ffc9a7146101dc57806306fdde03146101fc5780630e89341c1461021e578063156e29f61461023e575b600080fd5b34801561017557600080fd5b50610199610184366004611cac565b600c6020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b3480156101ba57600080fd5b506101ce6101c9366004611ad8565b610512565b6040519081526020016101a5565b3480156101e857600080fd5b506101996101f7366004611c74565b6105a9565b34801561020857600080fd5b506102116105fb565b6040516101a59190611ebe565b34801561022a57600080fd5b50610211610239366004611cac565b610689565b34801561024a57600080fd5b5061025e610259366004611b01565b61072b565b005b34801561026c57600080fd5b5061025e61027b366004611d07565b610806565b34801561028c57600080fd5b5061025e61029b366004611ce6565b61088c565b3480156102ac57600080fd5b5061025e6102bb3660046119a6565b6108c8565b3480156102cc57600080fd5b5061025e6102db366004611ce6565b61095f565b3480156102ec57600080fd5b506101ce6102fb366004611cac565b600d6020526000908152604090205481565b34801561031957600080fd5b5061032d610328366004611b33565b61099b565b6040516101a59190611e7d565b61025e610348366004611bfe565b610afd565b34801561035957600080fd5b5061025e610d55565b34801561036e57600080fd5b506101ce61037d366004611cac565b600a6020526000908152604090205481565b34801561039b57600080fd5b506003546040516001600160a01b0390911681526020016101a5565b3480156103c357600080fd5b50610211610d8b565b3480156103d857600080fd5b5061025e6103e7366004611aaf565b610d98565b3480156103f857600080fd5b506101ce610407366004611cac565b600b6020526000908152604090205481565b34801561042557600080fd5b50610211610434366004611cac565b610da7565b34801561044557600080fd5b5061019961045436600461195a565b600e6020526000908152604090205460ff1681565b34801561047557600080fd5b5061025e610484366004611cc4565b610dc0565b34801561049557600080fd5b506101996104a4366004611974565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b3480156104de57600080fd5b5061025e6104ed366004611a4c565b610e0a565b3480156104fe57600080fd5b5061025e61050d36600461195a565b610e91565b60006001600160a01b0383166105835760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b14806105da57506001600160e01b031982166303a24d0760e21b145b806105f557506301ffc9a760e01b6001600160e01b03198316145b92915050565b6007805461060890612019565b80601f016020809104026020016040519081016040528092919081815260200182805461063490612019565b80156106815780601f1061065657610100808354040283529160200191610681565b820191906000526020600020905b81548152906001019060200180831161066457829003601f168201915b505050505081565b60008181526009602052604090208054606091906106a690612019565b80601f01602080910402602001604051908101604052809291908181526020018280546106d290612019565b801561071f5780601f106106f45761010080835404028352916020019161071f565b820191906000526020600020905b81548152906001019060200180831161070257829003601f168201915b50505050509050919050565b6003546001600160a01b031633146107555760405162461bcd60e51b815260040161057a90611fa8565b6000828152600a6020908152604080832054600b9092529091205461077b908390612001565b11156107c35760405162461bcd60e51b81526020600482015260176024820152764d6178206d696e74206c696d697420726561636865642160481b604482015260640161057a565b6107de83838360405180602001604052806000815250610f2c565b6000828152600b6020526040812080548392906107fc908490612001565b9091555050505050565b6003546001600160a01b031633146108305760405162461bcd60e51b815260040161057a90611fa8565b6000828152600960209081526040909120825161084f9284019061179d565b50817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b826040516108809190611ebe565b60405180910390a25050565b6003546001600160a01b031633146108b65760405162461bcd60e51b815260040161057a90611fa8565b6000918252600d602052604090912055565b6001600160a01b0385163314806108e457506108e485336104a4565b61094b5760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161057a565b6109588585858585611036565b5050505050565b6003546001600160a01b031633146109895760405162461bcd60e51b815260040161057a90611fa8565b6000918252600a602052604090912055565b60608151835114610a005760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b606482015260840161057a565b6000835167ffffffffffffffff811115610a2a57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610a53578160200160208202803683370190505b50905060005b8451811015610af557610aba858281518110610a8557634e487b7160e01b600052603260045260246000fd5b6020026020010151858381518110610aad57634e487b7160e01b600052603260045260246000fd5b6020026020010151610512565b828281518110610ada57634e487b7160e01b600052603260045260246000fd5b6020908102919091010152610aee81612081565b9050610a59565b509392505050565b6000818152600c602052604090205460ff1615610b5c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f74206d696e74207768696c65207061757365640000000000000000604482015260640161057a565b6000818152600a6020908152604080832054600b90925290912054610b82906001612001565b1115610bca5760405162461bcd60e51b81526020600482015260176024820152764d6178206d696e74206c696d697420726561636865642160481b604482015260640161057a565b336000908152600e602052604090205460ff1615610c2a5760405162461bcd60e51b815260206004820152601c60248201527f416464726573732068617320616c726561647920636c61696d65642100000000604482015260640161057a565b6003546001600160a01b03163314610cfe576040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050610cc08484808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250878152600d6020526040902054925085915061122f9050565b610cfc5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b604482015260640161057a565b505b610d1a3382600160405180602001604052806000815250610f2c565b336000908152600e60209081526040808320805460ff19166001908117909155848452600b90925282208054919290916107fc908490612001565b6003546001600160a01b03163314610d7f5760405162461bcd60e51b815260040161057a90611fa8565b610d896000611245565b565b6008805461060890612019565b610da3338383611297565b5050565b6009602052600090815260409020805461060890612019565b6003546001600160a01b03163314610dea5760405162461bcd60e51b815260040161057a90611fa8565b6000918252600c6020526040909120805460ff1916911515919091179055565b6001600160a01b038516331480610e265750610e2685336104a4565b610e845760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b606482015260840161057a565b6109588585858585611378565b6003546001600160a01b03163314610ebb5760405162461bcd60e51b815260040161057a90611fa8565b6001600160a01b038116610f205760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161057a565b610f2981611245565b50565b6001600160a01b038416610f8c5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840161057a565b33610fa681600087610f9d88611495565b61095888611495565b6000848152602081815260408083206001600160a01b038916845290915281208054859290610fd6908490612001565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610958816000878787876114ee565b81518351146110985760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b606482015260840161057a565b6001600160a01b0384166110be5760405162461bcd60e51b815260040161057a90611f19565b3360005b84518110156111c15760008582815181106110ed57634e487b7160e01b600052603260045260246000fd5b60200260200101519050600085838151811061111957634e487b7160e01b600052603260045260246000fd5b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156111695760405162461bcd60e51b815260040161057a90611f5e565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906111a6908490612001565b92505081905550505050806111ba90612081565b90506110c2565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611211929190611e90565b60405180910390a4611227818787878787611659565b505050505050565b60008261123c8584611723565b14949350505050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316141561130b5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b606482015260840161057a565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b03841661139e5760405162461bcd60e51b815260040161057a90611f19565b336113ae818787610f9d88611495565b6000848152602081815260408083206001600160a01b038a168452909152902054838110156113ef5760405162461bcd60e51b815260040161057a90611f5e565b6000858152602081815260408083206001600160a01b038b811685529252808320878503905590881682528120805486929061142c908490612001565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461148c8288888888886114ee565b50505050505050565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106114dd57634e487b7160e01b600052603260045260246000fd5b602090810291909101015292915050565b6001600160a01b0384163b156112275760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906115329089908990889088908890600401611e38565b602060405180830381600087803b15801561154c57600080fd5b505af192505050801561157c575060408051601f3d908101601f1916820190925261157991810190611c90565b60015b611629576115886120c8565b806308c379a014156115c2575061159d6120e0565b806115a857506115c4565b8060405162461bcd60e51b815260040161057a9190611ebe565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606482015260840161057a565b6001600160e01b0319811663f23a6e6160e01b1461148c5760405162461bcd60e51b815260040161057a90611ed1565b6001600160a01b0384163b156112275760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061169d9089908990889088908890600401611dda565b602060405180830381600087803b1580156116b757600080fd5b505af19250505080156116e7575060408051601f3d908101601f191682019092526116e491810190611c90565b60015b6116f3576115886120c8565b6001600160e01b0319811663bc197c8160e01b1461148c5760405162461bcd60e51b815260040161057a90611ed1565b600081815b8451811015610af557600085828151811061175357634e487b7160e01b600052603260045260246000fd5b60200260200101519050808311611779576000838152602082905260409020925061178a565b600081815260208490526040902092505b508061179581612081565b915050611728565b8280546117a990612019565b90600052602060002090601f0160209004810192826117cb5760008555611811565b82601f106117e457805160ff1916838001178555611811565b82800160010185558215611811579182015b828111156118115782518255916020019190600101906117f6565b5061181d929150611821565b5090565b5b8082111561181d5760008155600101611822565b600067ffffffffffffffff831115611850576118506120b2565b604051611867601f8501601f191660200182612054565b80915083815284848401111561187c57600080fd5b83836020830137600060208583010152509392505050565b80356001600160a01b03811681146118ab57600080fd5b919050565b600082601f8301126118c0578081fd5b813560206118cd82611fdd565b6040516118da8282612054565b8381528281019150858301600585901b870184018810156118f9578586fd5b855b85811015611917578135845292840192908401906001016118fb565b5090979650505050505050565b803580151581146118ab57600080fd5b600082601f830112611944578081fd5b61195383833560208501611836565b9392505050565b60006020828403121561196b578081fd5b61195382611894565b60008060408385031215611986578081fd5b61198f83611894565b915061199d60208401611894565b90509250929050565b600080600080600060a086880312156119bd578081fd5b6119c686611894565b94506119d460208701611894565b9350604086013567ffffffffffffffff808211156119f0578283fd5b6119fc89838a016118b0565b94506060880135915080821115611a11578283fd5b611a1d89838a016118b0565b93506080880135915080821115611a32578283fd5b50611a3f88828901611934565b9150509295509295909350565b600080600080600060a08688031215611a63578081fd5b611a6c86611894565b9450611a7a60208701611894565b93506040860135925060608601359150608086013567ffffffffffffffff811115611aa3578182fd5b611a3f88828901611934565b60008060408385031215611ac1578182fd5b611aca83611894565b915061199d60208401611924565b60008060408385031215611aea578182fd5b611af383611894565b946020939093013593505050565b600080600060608486031215611b15578283fd5b611b1e84611894565b95602085013595506040909401359392505050565b60008060408385031215611b45578182fd5b823567ffffffffffffffff80821115611b5c578384fd5b818501915085601f830112611b6f578384fd5b81356020611b7c82611fdd565b604051611b898282612054565b8381528281019150858301600585901b870184018b1015611ba8578889fd5b8896505b84871015611bd157611bbd81611894565b835260019690960195918301918301611bac565b5096505086013592505080821115611be7578283fd5b50611bf4858286016118b0565b9150509250929050565b600080600060408486031215611c12578081fd5b833567ffffffffffffffff80821115611c29578283fd5b818601915086601f830112611c3c578283fd5b813581811115611c4a578384fd5b8760208260051b8501011115611c5e578384fd5b6020928301989097509590910135949350505050565b600060208284031215611c85578081fd5b81356119538161216a565b600060208284031215611ca1578081fd5b81516119538161216a565b600060208284031215611cbd578081fd5b5035919050565b60008060408385031215611cd6578182fd5b8235915061199d60208401611924565b60008060408385031215611cf8578182fd5b50508035926020909101359150565b60008060408385031215611d19578182fd5b82359150602083013567ffffffffffffffff811115611d36578182fd5b8301601f81018513611d46578182fd5b611bf485823560208401611836565b6000815180845260208085019450808401835b83811015611d8457815187529582019590820190600101611d68565b509495945050505050565b60008151808452815b81811015611db457602081850181015186830182015201611d98565b81811115611dc55782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0386811682528516602082015260a060408201819052600090611e0690830186611d55565b8281036060840152611e188186611d55565b90508281036080840152611e2c8185611d8f565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090611e7290830184611d8f565b979650505050505050565b6020815260006119536020830184611d55565b604081526000611ea36040830185611d55565b8281036020840152611eb58185611d55565b95945050505050565b6020815260006119536020830184611d8f565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600067ffffffffffffffff821115611ff757611ff76120b2565b5060051b60200190565b600082198211156120145761201461209c565b500190565b600181811c9082168061202d57607f821691505b6020821081141561204e57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f1916810167ffffffffffffffff8111828210171561207a5761207a6120b2565b6040525050565b60006000198214156120955761209561209c565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d11156120dd57600481823e5160e01c5b90565b600060443d10156120ee5790565b6040516003193d81016004833e81513d67ffffffffffffffff816024840111818411171561211e57505050505090565b82850191508151818111156121365750505050505090565b843d87010160208285010111156121505750505050505090565b61215f60208286010187612054565b509095945050505050565b6001600160e01b031981168114610f2957600080fdfea264697066735822122003e375ff08cb5ed99121a0c176f228937eae9cae3341a45bd388b299d4f97f0464736f6c63430008040033646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c65794a706257466e5a53493649434a7063475a7a4f6938765557315a6547524c626b4a3465584e535a57356a5230517a6358427753314e6c565549314d335a4d4e44527957554a4c5757397955334a354e577434564339486232786b58305a766457356b5a584a7a4c6d31774e43497349434a755957316c496a6f67496b5242546b7443543152544945647662475167526d3931626d526c636e4d675547467a6379497349434a306232746c626b6c6b496a6f674d537767496d463064484a70596e56305a584d694f69426265794a30636d4670644639306558426c496a6f67496d316c62574a6c636e4e6f6158416764476c6c6369497349434a32595778315a53493649434a486232786b496e30734948736964484a686158526664486c775a53493649434a68636e5270633351694c434169646d4673645755694f694169513256744946526c656d4e6862694a394c434237496e527959576c3058335235634755694f6941696258567a61574d694c434169646d4673645755694f6941695245354c516c525449454a50554341764c79424e6369346754326c3662794a395858303d646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c65794a706257466e5a53493649434a7063475a7a4f6938765557315a6547524c626b4a3465584e535a57356a5230517a6358427753314e6c565549314d335a4d4e44527957554a4c5757397955334a354e57743456433954615778325a584a66526d3931626d526c636e4d756258413049697767496d3568625755694f6941695245464f53304a5056464d6755326c73646d567949455a766457356b5a584a7a4946426863334d694c434169644739725a57354a5a4349364944497349434a686448527961574a316447567a496a6f675733736964484a686158526664486c775a53493649434a745a5731695a584a7a61476c77494852705a5849694c434169646d4673645755694f69416955326c73646d5679496e30734948736964484a686158526664486c775a53493649434a68636e5270633351694c434169646d4673645755694f694169513256744946526c656d4e6862694a394c434237496e527959576c3058335235634755694f6941696258567a61574d694c434169646d4673645755694f6941695245354c516c52544945645354303957525341764c79424462324e76494531685a32353163334e7662694a395858303d646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c65794a706257466e5a53493649434a7063475a7a4f6938765557315a6547524c626b4a3465584e535a57356a5230517a6358427753314e6c565549314d335a4d4e44527957554a4c5757397955334a354e57743456433951624746306157353162563947623356755a47567963793574634451694c434169626d46745a53493649434a455155354c516b395555794251624746306157353162534247623356755a4756796379425159584e7a49697767496e527661325675535751694f6941774c43416959585230636d6c696458526c6379493649467437496e527959576c3058335235634755694f69416962575674596d567963326870634342306157567949697767496e5a686248566c496a6f67496c427359585270626e5674496e30734948736964484a686158526664486c775a53493649434a68636e5270633351694c434169646d4673645755694f694169513256744946526c656d4e6862694a394c434237496e527959576c3058335235634755694f6941696258567a61574d694c434169646d4673645755694f6941695245354c516c5254494652495255314649433876494531794c69425061587076496e316466513d3d
Deployed Bytecode
0x6080604052600436106101645760003560e01c806370b9e991116100d1578063bd85b0391161008a578063daff97b511610064578063daff97b514610469578063e985e9c514610489578063f242432a146104d2578063f2fde38b146104f257600080fd5b8063bd85b039146103ec578063c87b56dd14610419578063c884ef831461043957600080fd5b806370b9e9911461033a578063715018a61461034d578063869f7594146103625780638da5cb5b1461038f57806395d89b41146103b7578063a22cb465146103cc57600080fd5b8063162094c411610123578063162094c41461026057806318712c21146102805780632eb2c2d6146102a057806337da577c146102c05780633c70b357146102e05780634e1273f41461030d57600080fd5b8062dde10e14610169578062fdd58e146101ae57806301ffc9a7146101dc57806306fdde03146101fc5780630e89341c1461021e578063156e29f61461023e575b600080fd5b34801561017557600080fd5b50610199610184366004611cac565b600c6020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b3480156101ba57600080fd5b506101ce6101c9366004611ad8565b610512565b6040519081526020016101a5565b3480156101e857600080fd5b506101996101f7366004611c74565b6105a9565b34801561020857600080fd5b506102116105fb565b6040516101a59190611ebe565b34801561022a57600080fd5b50610211610239366004611cac565b610689565b34801561024a57600080fd5b5061025e610259366004611b01565b61072b565b005b34801561026c57600080fd5b5061025e61027b366004611d07565b610806565b34801561028c57600080fd5b5061025e61029b366004611ce6565b61088c565b3480156102ac57600080fd5b5061025e6102bb3660046119a6565b6108c8565b3480156102cc57600080fd5b5061025e6102db366004611ce6565b61095f565b3480156102ec57600080fd5b506101ce6102fb366004611cac565b600d6020526000908152604090205481565b34801561031957600080fd5b5061032d610328366004611b33565b61099b565b6040516101a59190611e7d565b61025e610348366004611bfe565b610afd565b34801561035957600080fd5b5061025e610d55565b34801561036e57600080fd5b506101ce61037d366004611cac565b600a6020526000908152604090205481565b34801561039b57600080fd5b506003546040516001600160a01b0390911681526020016101a5565b3480156103c357600080fd5b50610211610d8b565b3480156103d857600080fd5b5061025e6103e7366004611aaf565b610d98565b3480156103f857600080fd5b506101ce610407366004611cac565b600b6020526000908152604090205481565b34801561042557600080fd5b50610211610434366004611cac565b610da7565b34801561044557600080fd5b5061019961045436600461195a565b600e6020526000908152604090205460ff1681565b34801561047557600080fd5b5061025e610484366004611cc4565b610dc0565b34801561049557600080fd5b506101996104a4366004611974565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b3480156104de57600080fd5b5061025e6104ed366004611a4c565b610e0a565b3480156104fe57600080fd5b5061025e61050d36600461195a565b610e91565b60006001600160a01b0383166105835760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b14806105da57506001600160e01b031982166303a24d0760e21b145b806105f557506301ffc9a760e01b6001600160e01b03198316145b92915050565b6007805461060890612019565b80601f016020809104026020016040519081016040528092919081815260200182805461063490612019565b80156106815780601f1061065657610100808354040283529160200191610681565b820191906000526020600020905b81548152906001019060200180831161066457829003601f168201915b505050505081565b60008181526009602052604090208054606091906106a690612019565b80601f01602080910402602001604051908101604052809291908181526020018280546106d290612019565b801561071f5780601f106106f45761010080835404028352916020019161071f565b820191906000526020600020905b81548152906001019060200180831161070257829003601f168201915b50505050509050919050565b6003546001600160a01b031633146107555760405162461bcd60e51b815260040161057a90611fa8565b6000828152600a6020908152604080832054600b9092529091205461077b908390612001565b11156107c35760405162461bcd60e51b81526020600482015260176024820152764d6178206d696e74206c696d697420726561636865642160481b604482015260640161057a565b6107de83838360405180602001604052806000815250610f2c565b6000828152600b6020526040812080548392906107fc908490612001565b9091555050505050565b6003546001600160a01b031633146108305760405162461bcd60e51b815260040161057a90611fa8565b6000828152600960209081526040909120825161084f9284019061179d565b50817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b826040516108809190611ebe565b60405180910390a25050565b6003546001600160a01b031633146108b65760405162461bcd60e51b815260040161057a90611fa8565b6000918252600d602052604090912055565b6001600160a01b0385163314806108e457506108e485336104a4565b61094b5760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161057a565b6109588585858585611036565b5050505050565b6003546001600160a01b031633146109895760405162461bcd60e51b815260040161057a90611fa8565b6000918252600a602052604090912055565b60608151835114610a005760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b606482015260840161057a565b6000835167ffffffffffffffff811115610a2a57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610a53578160200160208202803683370190505b50905060005b8451811015610af557610aba858281518110610a8557634e487b7160e01b600052603260045260246000fd5b6020026020010151858381518110610aad57634e487b7160e01b600052603260045260246000fd5b6020026020010151610512565b828281518110610ada57634e487b7160e01b600052603260045260246000fd5b6020908102919091010152610aee81612081565b9050610a59565b509392505050565b6000818152600c602052604090205460ff1615610b5c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f74206d696e74207768696c65207061757365640000000000000000604482015260640161057a565b6000818152600a6020908152604080832054600b90925290912054610b82906001612001565b1115610bca5760405162461bcd60e51b81526020600482015260176024820152764d6178206d696e74206c696d697420726561636865642160481b604482015260640161057a565b336000908152600e602052604090205460ff1615610c2a5760405162461bcd60e51b815260206004820152601c60248201527f416464726573732068617320616c726561647920636c61696d65642100000000604482015260640161057a565b6003546001600160a01b03163314610cfe576040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050610cc08484808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250878152600d6020526040902054925085915061122f9050565b610cfc5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210383937b7b360991b604482015260640161057a565b505b610d1a3382600160405180602001604052806000815250610f2c565b336000908152600e60209081526040808320805460ff19166001908117909155848452600b90925282208054919290916107fc908490612001565b6003546001600160a01b03163314610d7f5760405162461bcd60e51b815260040161057a90611fa8565b610d896000611245565b565b6008805461060890612019565b610da3338383611297565b5050565b6009602052600090815260409020805461060890612019565b6003546001600160a01b03163314610dea5760405162461bcd60e51b815260040161057a90611fa8565b6000918252600c6020526040909120805460ff1916911515919091179055565b6001600160a01b038516331480610e265750610e2685336104a4565b610e845760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b606482015260840161057a565b6109588585858585611378565b6003546001600160a01b03163314610ebb5760405162461bcd60e51b815260040161057a90611fa8565b6001600160a01b038116610f205760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161057a565b610f2981611245565b50565b6001600160a01b038416610f8c5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840161057a565b33610fa681600087610f9d88611495565b61095888611495565b6000848152602081815260408083206001600160a01b038916845290915281208054859290610fd6908490612001565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610958816000878787876114ee565b81518351146110985760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b606482015260840161057a565b6001600160a01b0384166110be5760405162461bcd60e51b815260040161057a90611f19565b3360005b84518110156111c15760008582815181106110ed57634e487b7160e01b600052603260045260246000fd5b60200260200101519050600085838151811061111957634e487b7160e01b600052603260045260246000fd5b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156111695760405162461bcd60e51b815260040161057a90611f5e565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906111a6908490612001565b92505081905550505050806111ba90612081565b90506110c2565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611211929190611e90565b60405180910390a4611227818787878787611659565b505050505050565b60008261123c8584611723565b14949350505050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316141561130b5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b606482015260840161057a565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b03841661139e5760405162461bcd60e51b815260040161057a90611f19565b336113ae818787610f9d88611495565b6000848152602081815260408083206001600160a01b038a168452909152902054838110156113ef5760405162461bcd60e51b815260040161057a90611f5e565b6000858152602081815260408083206001600160a01b038b811685529252808320878503905590881682528120805486929061142c908490612001565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461148c8288888888886114ee565b50505050505050565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106114dd57634e487b7160e01b600052603260045260246000fd5b602090810291909101015292915050565b6001600160a01b0384163b156112275760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906115329089908990889088908890600401611e38565b602060405180830381600087803b15801561154c57600080fd5b505af192505050801561157c575060408051601f3d908101601f1916820190925261157991810190611c90565b60015b611629576115886120c8565b806308c379a014156115c2575061159d6120e0565b806115a857506115c4565b8060405162461bcd60e51b815260040161057a9190611ebe565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606482015260840161057a565b6001600160e01b0319811663f23a6e6160e01b1461148c5760405162461bcd60e51b815260040161057a90611ed1565b6001600160a01b0384163b156112275760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061169d9089908990889088908890600401611dda565b602060405180830381600087803b1580156116b757600080fd5b505af19250505080156116e7575060408051601f3d908101601f191682019092526116e491810190611c90565b60015b6116f3576115886120c8565b6001600160e01b0319811663bc197c8160e01b1461148c5760405162461bcd60e51b815260040161057a90611ed1565b600081815b8451811015610af557600085828151811061175357634e487b7160e01b600052603260045260246000fd5b60200260200101519050808311611779576000838152602082905260409020925061178a565b600081815260208490526040902092505b508061179581612081565b915050611728565b8280546117a990612019565b90600052602060002090601f0160209004810192826117cb5760008555611811565b82601f106117e457805160ff1916838001178555611811565b82800160010185558215611811579182015b828111156118115782518255916020019190600101906117f6565b5061181d929150611821565b5090565b5b8082111561181d5760008155600101611822565b600067ffffffffffffffff831115611850576118506120b2565b604051611867601f8501601f191660200182612054565b80915083815284848401111561187c57600080fd5b83836020830137600060208583010152509392505050565b80356001600160a01b03811681146118ab57600080fd5b919050565b600082601f8301126118c0578081fd5b813560206118cd82611fdd565b6040516118da8282612054565b8381528281019150858301600585901b870184018810156118f9578586fd5b855b85811015611917578135845292840192908401906001016118fb565b5090979650505050505050565b803580151581146118ab57600080fd5b600082601f830112611944578081fd5b61195383833560208501611836565b9392505050565b60006020828403121561196b578081fd5b61195382611894565b60008060408385031215611986578081fd5b61198f83611894565b915061199d60208401611894565b90509250929050565b600080600080600060a086880312156119bd578081fd5b6119c686611894565b94506119d460208701611894565b9350604086013567ffffffffffffffff808211156119f0578283fd5b6119fc89838a016118b0565b94506060880135915080821115611a11578283fd5b611a1d89838a016118b0565b93506080880135915080821115611a32578283fd5b50611a3f88828901611934565b9150509295509295909350565b600080600080600060a08688031215611a63578081fd5b611a6c86611894565b9450611a7a60208701611894565b93506040860135925060608601359150608086013567ffffffffffffffff811115611aa3578182fd5b611a3f88828901611934565b60008060408385031215611ac1578182fd5b611aca83611894565b915061199d60208401611924565b60008060408385031215611aea578182fd5b611af383611894565b946020939093013593505050565b600080600060608486031215611b15578283fd5b611b1e84611894565b95602085013595506040909401359392505050565b60008060408385031215611b45578182fd5b823567ffffffffffffffff80821115611b5c578384fd5b818501915085601f830112611b6f578384fd5b81356020611b7c82611fdd565b604051611b898282612054565b8381528281019150858301600585901b870184018b1015611ba8578889fd5b8896505b84871015611bd157611bbd81611894565b835260019690960195918301918301611bac565b5096505086013592505080821115611be7578283fd5b50611bf4858286016118b0565b9150509250929050565b600080600060408486031215611c12578081fd5b833567ffffffffffffffff80821115611c29578283fd5b818601915086601f830112611c3c578283fd5b813581811115611c4a578384fd5b8760208260051b8501011115611c5e578384fd5b6020928301989097509590910135949350505050565b600060208284031215611c85578081fd5b81356119538161216a565b600060208284031215611ca1578081fd5b81516119538161216a565b600060208284031215611cbd578081fd5b5035919050565b60008060408385031215611cd6578182fd5b8235915061199d60208401611924565b60008060408385031215611cf8578182fd5b50508035926020909101359150565b60008060408385031215611d19578182fd5b82359150602083013567ffffffffffffffff811115611d36578182fd5b8301601f81018513611d46578182fd5b611bf485823560208401611836565b6000815180845260208085019450808401835b83811015611d8457815187529582019590820190600101611d68565b509495945050505050565b60008151808452815b81811015611db457602081850181015186830182015201611d98565b81811115611dc55782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0386811682528516602082015260a060408201819052600090611e0690830186611d55565b8281036060840152611e188186611d55565b90508281036080840152611e2c8185611d8f565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090611e7290830184611d8f565b979650505050505050565b6020815260006119536020830184611d55565b604081526000611ea36040830185611d55565b8281036020840152611eb58185611d55565b95945050505050565b6020815260006119536020830184611d8f565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600067ffffffffffffffff821115611ff757611ff76120b2565b5060051b60200190565b600082198211156120145761201461209c565b500190565b600181811c9082168061202d57607f821691505b6020821081141561204e57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f1916810167ffffffffffffffff8111828210171561207a5761207a6120b2565b6040525050565b60006000198214156120955761209561209c565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d11156120dd57600481823e5160e01c5b90565b600060443d10156120ee5790565b6040516003193d81016004833e81513d67ffffffffffffffff816024840111818411171561211e57505050505090565b82850191508151818111156121365750505050505090565b843d87010160208285010111156121505750505050505090565b61215f60208286010187612054565b509095945050505050565b6001600160e01b031981168114610f2957600080fdfea264697066735822122003e375ff08cb5ed99121a0c176f228937eae9cae3341a45bd388b299d4f97f0464736f6c63430008040033
Deployed Bytecode Sourcemap
39193:3999:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39532:37;;;;;;;;;;-1:-1:-1;39532:37:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12538:14:1;;12531:22;12513:41;;12501:2;12486:18;39532:37:0;;;;;;;;25663:231;;;;;;;;;;-1:-1:-1;25663:231:0;;;;;:::i;:::-;;:::i;:::-;;;12711:25:1;;;12699:2;12684:18;25663:231:0;12666:76:1;24686:310:0;;;;;;;;;;-1:-1:-1;24686:310:0;;;;;:::i;:::-;;:::i;39313:45::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;41783:115::-;;;;;;;;;;-1:-1:-1;41783:115:0;;;;;:::i;:::-;;:::i;42249:285::-;;;;;;;;;;-1:-1:-1;42249:285:0;;;;;:::i;:::-;;:::i;:::-;;41644:134;;;;;;;;;;-1:-1:-1;41644:134:0;;;;;:::i;:::-;;:::i;42134:110::-;;;;;;;;;;-1:-1:-1;42134:110:0;;;;;:::i;:::-;;:::i;27602:442::-;;;;;;;;;;-1:-1:-1;27602:442:0;;;;;:::i;:::-;;:::i;41903:118::-;;;;;;;;;;-1:-1:-1;41903:118:0;;;;;:::i;:::-;;:::i;39573:44::-;;;;;;;;;;-1:-1:-1;39573:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;26060:524;;;;;;;;;;-1:-1:-1;26060:524:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;42539:650::-;;;;;;:::i;:::-;;:::i;5390:103::-;;;;;;;;;;;;;:::i;39442:40::-;;;;;;;;;;-1:-1:-1;39442:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;4739:87;;;;;;;;;;-1:-1:-1;4812:6:0;;4739:87;;-1:-1:-1;;;;;4812:6:0;;;10179:51:1;;10167:2;10152:18;4739:87:0;10134:102:1;39362:29:0;;;;;;;;;;;;;:::i;26657:155::-;;;;;;;;;;-1:-1:-1;26657:155:0;;;;;:::i;:::-;;:::i;39486:42::-;;;;;;;;;;-1:-1:-1;39486:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;39397:41;;;;;;;;;;-1:-1:-1;39397:41:0;;;;;:::i;:::-;;:::i;39621:::-;;;;;;;;;;-1:-1:-1;39621:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;42026:103;;;;;;;;;;-1:-1:-1;42026:103:0;;;;;:::i;:::-;;:::i;26884:168::-;;;;;;;;;;-1:-1:-1;26884:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;27007:27:0;;;26983:4;27007:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;26884:168;27124:401;;;;;;;;;;-1:-1:-1;27124:401:0;;;;;:::i;:::-;;:::i;5648:201::-;;;;;;;;;;-1:-1:-1;5648:201:0;;;;;:::i;:::-;;:::i;25663:231::-;25749:7;-1:-1:-1;;;;;25777:21:0;;25769:77;;;;-1:-1:-1;;;25769:77:0;;14355:2:1;25769:77:0;;;14337:21:1;14394:2;14374:18;;;14367:30;14433:34;14413:18;;;14406:62;-1:-1:-1;;;14484:18:1;;;14477:41;14535:19;;25769:77:0;;;;;;;;;-1:-1:-1;25864:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;25864:22:0;;;;;;;;;;;;25663:231::o;24686:310::-;24788:4;-1:-1:-1;;;;;;24825:41:0;;-1:-1:-1;;;24825:41:0;;:110;;-1:-1:-1;;;;;;;24883:52:0;;-1:-1:-1;;;24883:52:0;24825:110;:163;;;-1:-1:-1;;;;;;;;;;16219:40:0;;;24952:36;24805:183;24686:310;-1:-1:-1;;24686:310:0:o;39313:45::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;41783:115::-;41878:15;;;;:8;:15;;;;;41871:22;;41850:13;;41878:15;41871:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41783:115;;;:::o;42249:285::-;4812:6;;-1:-1:-1;;;;;4812:6:0;3545:10;4959:23;4951:68;;;;-1:-1:-1;;;4951:68:0;;;;;;;:::i;:::-;42415:16:::1;::::0;;;:9:::1;:16;::::0;;;;;;;;42383:11:::1;:18:::0;;;;;;;:28:::1;::::0;42404:7;;42383:28:::1;:::i;:::-;:48;;42374:86;;;::::0;-1:-1:-1;;;42374:86:0;;14003:2:1;42374:86:0::1;::::0;::::1;13985:21:1::0;14042:2;14022:18;;;14015:30;-1:-1:-1;;;14061:18:1;;;14054:53;14124:18;;42374:86:0::1;13975:173:1::0;42374:86:0::1;42465:30;42472:3;42477;42482:7;42465:30;;;;;;;;;;;::::0;:5:::1;:30::i;:::-;42500:18;::::0;;;:11:::1;:18;::::0;;;;:29;;42522:7;;42500:18;:29:::1;::::0;42522:7;;42500:29:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;42249:285:0:o;41644:134::-;4812:6;;-1:-1:-1;;;;;4812:6:0;3545:10;4959:23;4951:68;;;;-1:-1:-1;;;4951:68:0;;;;;;;:::i;:::-;41727:13:::1;::::0;;;:8:::1;:13;::::0;;;;;;;:20;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;41768:3;41757:16;41762:4;41757:16;;;;;;:::i;:::-;;;;;;;;41644:134:::0;;:::o;42134:110::-;4812:6;;-1:-1:-1;;;;;4812:6:0;3545:10;4959:23;4951:68;;;;-1:-1:-1;;;4951:68:0;;;;;;;:::i;:::-;42214:17:::1;::::0;;;:10:::1;:17;::::0;;;;;:25;42134:110::o;27602:442::-;-1:-1:-1;;;;;27835:20:0;;3545:10;27835:20;;:60;;-1:-1:-1;27859:36:0;27876:4;3545:10;26884:168;:::i;27859:36::-;27813:160;;;;-1:-1:-1;;;27813:160:0;;16688:2:1;27813:160:0;;;16670:21:1;16727:2;16707:18;;;16700:30;16766:34;16746:18;;;16739:62;-1:-1:-1;;;16817:18:1;;;16810:48;16875:19;;27813:160:0;16660:240:1;27813:160:0;27984:52;28007:4;28013:2;28017:3;28022:7;28031:4;27984:22;:52::i;:::-;27602:442;;;;;:::o;41903:118::-;4812:6;;-1:-1:-1;;;;;4812:6:0;3545:10;4959:23;4951:68;;;;-1:-1:-1;;;4951:68:0;;;;;;;:::i;:::-;41987:16:::1;::::0;;;:9:::1;:16;::::0;;;;;:29;41903:118::o;26060:524::-;26216:16;26277:3;:10;26258:8;:15;:29;26250:83;;;;-1:-1:-1;;;26250:83:0;;18988:2:1;26250:83:0;;;18970:21:1;19027:2;19007:18;;;19000:30;19066:34;19046:18;;;19039:62;-1:-1:-1;;;19117:18:1;;;19110:39;19166:19;;26250:83:0;18960:231:1;26250:83:0;26346:30;26393:8;:15;26379:30;;;;;;-1:-1:-1;;;26379:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26379:30:0;;26346:63;;26427:9;26422:122;26446:8;:15;26442:1;:19;26422:122;;;26502:30;26512:8;26521:1;26512:11;;;;;;-1:-1:-1;;;26512:11:0;;;;;;;;;;;;;;;26525:3;26529:1;26525:6;;;;;;-1:-1:-1;;;26525:6:0;;;;;;;;;;;;;;;26502:9;:30::i;:::-;26483:13;26497:1;26483:16;;;;;;-1:-1:-1;;;26483:16:0;;;;;;;;;;;;;;;;;;:49;26463:3;;;:::i;:::-;;;26422:122;;;-1:-1:-1;26563:13:0;26060:524;-1:-1:-1;;;26060:524:0:o;42539:650::-;42688:13;;;;:6;:13;;;;;;;;42686:15;42677:54;;;;-1:-1:-1;;;42677:54:0;;15174:2:1;42677:54:0;;;15156:21:1;15213:2;15193:18;;;15186:30;15252:26;15232:18;;;15225:54;15296:18;;42677:54:0;15146:174:1;42677:54:0;42771:16;;;;:9;:16;;;;;;;;;42745:11;:18;;;;;;;:22;;42766:1;42745:22;:::i;:::-;:42;;42736:80;;;;-1:-1:-1;;;42736:80:0;;14003:2:1;42736:80:0;;;13985:21:1;14042:2;14022:18;;;14015:30;-1:-1:-1;;;14061:18:1;;;14054:53;14124:18;;42736:80:0;13975:173:1;42736:80:0;42841:10;42832:21;;;;:7;:21;;;;;;;;42830:23;42821:66;;;;-1:-1:-1;;;42821:66:0;;17879:2:1;42821:66:0;;;17861:21:1;17918:2;17898:18;;;17891:30;17957;17937:18;;;17930:58;18005:18;;42821:66:0;17851:178:1;42821:66:0;4812:6;;-1:-1:-1;;;;;4812:6:0;42899:10;:21;42894:192;;42955:30;;-1:-1:-1;;42973:10:0;9948:2:1;9944:15;9940:53;42955:30:0;;;9928:66:1;42929:12:0;;10010::1;;42955:30:0;;;;;;;;;;;;42944:43;;;;;;42929:58;;43002:59;43022:12;;43002:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43036:17:0;;;:10;:17;;;;;;;-1:-1:-1;43055:4:0;;-1:-1:-1;43002:18:0;;-1:-1:-1;43002:59:0:i;:::-;42993:87;;;;-1:-1:-1;;;42993:87:0;;18236:2:1;42993:87:0;;;18218:21:1;18275:2;18255:18;;;18248:30;-1:-1:-1;;;18294:18:1;;;18287:43;18347:18;;42993:87:0;18208:163:1;42993:87:0;42894:192;;43092:31;43099:10;43111:3;43116:1;43092:31;;;;;;;;;;;;:5;:31::i;:::-;43137:10;43128:21;;;;:7;:21;;;;;;;;:28;;-1:-1:-1;;43128:28:0;43152:4;43128:28;;;;;;43161:18;;;:11;:18;;;;;:23;;43152:4;;43161:18;;:23;;43152:4;;43161:23;:::i;5390:103::-;4812:6;;-1:-1:-1;;;;;4812:6:0;3545:10;4959:23;4951:68;;;;-1:-1:-1;;;4951:68:0;;;;;;;:::i;:::-;5455:30:::1;5482:1;5455:18;:30::i;:::-;5390:103::o:0;39362:29::-;;;;;;;:::i;26657:155::-;26752:52;3545:10;26785:8;26795;26752:18;:52::i;:::-;26657:155;;:::o;39397:41::-;;;;;;;;;;;;;;;;:::i;42026:103::-;4812:6;;-1:-1:-1;;;;;4812:6:0;3545:10;4959:23;4951:68;;;;-1:-1:-1;;;4951:68:0;;;;;;;:::i;:::-;42101:13:::1;::::0;;;:6:::1;:13;::::0;;;;;:23;;-1:-1:-1;;42101:23:0::1;::::0;::::1;;::::0;;;::::1;::::0;;42026:103::o;27124:401::-;-1:-1:-1;;;;;27332:20:0;;3545:10;27332:20;;:60;;-1:-1:-1;27356:36:0;27373:4;3545:10;26884:168;:::i;27356:36::-;27310:151;;;;-1:-1:-1;;;27310:151:0;;15527:2:1;27310:151:0;;;15509:21:1;15566:2;15546:18;;;15539:30;15605:34;15585:18;;;15578:62;-1:-1:-1;;;15656:18:1;;;15649:39;15705:19;;27310:151:0;15499:231:1;27310:151:0;27472:45;27490:4;27496:2;27500;27504:6;27512:4;27472:17;:45::i;5648:201::-;4812:6;;-1:-1:-1;;;;;4812:6:0;3545:10;4959:23;4951:68;;;;-1:-1:-1;;;4951:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5737:22:0;::::1;5729:73;;;::::0;-1:-1:-1;;;5729:73:0;;14767:2:1;5729:73:0::1;::::0;::::1;14749:21:1::0;14806:2;14786:18;;;14779:30;14845:34;14825:18;;;14818:62;-1:-1:-1;;;14896:18:1;;;14889:36;14942:19;;5729:73:0::1;14739:228:1::0;5729:73:0::1;5813:28;5832:8;5813:18;:28::i;:::-;5648:201:::0;:::o;32078:569::-;-1:-1:-1;;;;;32231:16:0;;32223:62;;;;-1:-1:-1;;;32223:62:0;;19807:2:1;32223:62:0;;;19789:21:1;19846:2;19826:18;;;19819:30;19885:34;19865:18;;;19858:62;-1:-1:-1;;;19936:18:1;;;19929:31;19977:19;;32223:62:0;19779:223:1;32223:62:0;3545:10;32342:102;3545:10;32298:16;32385:2;32389:21;32407:2;32389:17;:21::i;:::-;32412:25;32430:6;32412:17;:25::i;32342:102::-;32457:9;:13;;;;;;;;;;;-1:-1:-1;;;;;32457:17:0;;;;;;;;;:27;;32478:6;;32457:9;:27;;32478:6;;32457:27;:::i;:::-;;;;-1:-1:-1;;32500:52:0;;;20363:25:1;;;20419:2;20404:18;;20397:34;;;-1:-1:-1;;;;;32500:52:0;;;;32533:1;;32500:52;;;;;;20336:18:1;32500:52:0;;;;;;;32565:74;32596:8;32614:1;32618:2;32622;32626:6;32634:4;32565:30;:74::i;29686:1074::-;29913:7;:14;29899:3;:10;:28;29891:81;;;;-1:-1:-1;;;29891:81:0;;19398:2:1;29891:81:0;;;19380:21:1;19437:2;19417:18;;;19410:30;19476:34;19456:18;;;19449:62;-1:-1:-1;;;19527:18:1;;;19520:38;19575:19;;29891:81:0;19370:230:1;29891:81:0;-1:-1:-1;;;;;29991:16:0;;29983:66;;;;-1:-1:-1;;;29983:66:0;;;;;;;:::i;:::-;3545:10;30062:16;30179:421;30203:3;:10;30199:1;:14;30179:421;;;30235:10;30248:3;30252:1;30248:6;;;;;;-1:-1:-1;;;30248:6:0;;;;;;;;;;;;;;;30235:19;;30269:14;30286:7;30294:1;30286:10;;;;;;-1:-1:-1;;;30286:10:0;;;;;;;;;;;;;;;;;;;;30313:19;30335:13;;;;;;;;;;-1:-1:-1;;;;;30335:19:0;;;;;;;;;;;;30286:10;;-1:-1:-1;30377:21:0;;;;30369:76;;;;-1:-1:-1;;;30369:76:0;;;;;;;:::i;:::-;30489:9;:13;;;;;;;;;;;-1:-1:-1;;;;;30489:19:0;;;;;;;;;;30511:20;;;30489:42;;30561:17;;;;;;;:27;;30511:20;;30489:9;30561:27;;30511:20;;30561:27;:::i;:::-;;;;;;;;30179:421;;;30215:3;;;;:::i;:::-;;;30179:421;;;;30647:2;-1:-1:-1;;;;;30617:47:0;30641:4;-1:-1:-1;;;;;30617:47:0;30631:8;-1:-1:-1;;;;;30617:47:0;;30651:3;30656:7;30617:47;;;;;;;:::i;:::-;;;;;;;;30677:75;30713:8;30723:4;30729:2;30733:3;30738:7;30747:4;30677:35;:75::i;:::-;29686:1074;;;;;;:::o;1431:190::-;1556:4;1609;1580:25;1593:5;1600:4;1580:12;:25::i;:::-;:33;;1431:190;-1:-1:-1;;;;1431:190:0:o;6009:191::-;6102:6;;;-1:-1:-1;;;;;6119:17:0;;;-1:-1:-1;;;;;;6119:17:0;;;;;;;6152:40;;6102:6;;;6119:17;6102:6;;6152:40;;6083:16;;6152:40;6009:191;;:::o;35872:331::-;36027:8;-1:-1:-1;;;;;36018:17:0;:5;-1:-1:-1;;;;;36018:17:0;;;36010:71;;;;-1:-1:-1;;;36010:71:0;;18578:2:1;36010:71:0;;;18560:21:1;18617:2;18597:18;;;18590:30;18656:34;18636:18;;;18629:62;-1:-1:-1;;;18707:18:1;;;18700:39;18756:19;;36010:71:0;18550:231:1;36010:71:0;-1:-1:-1;;;;;36092:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;36092:46:0;;;;;;;;;;36154:41;;12513::1;;;36154::0;;12486:18:1;36154:41:0;;;;;;;35872:331;;;:::o;28508:820::-;-1:-1:-1;;;;;28696:16:0;;28688:66;;;;-1:-1:-1;;;28688:66:0;;;;;;;:::i;:::-;3545:10;28811:96;3545:10;28842:4;28848:2;28852:21;28870:2;28852:17;:21::i;28811:96::-;28920:19;28942:13;;;;;;;;;;;-1:-1:-1;;;;;28942:19:0;;;;;;;;;;28980:21;;;;28972:76;;;;-1:-1:-1;;;28972:76:0;;;;;;;:::i;:::-;29084:9;:13;;;;;;;;;;;-1:-1:-1;;;;;29084:19:0;;;;;;;;;;29106:20;;;29084:42;;29148:17;;;;;;;:27;;29106:20;;29084:9;29148:27;;29106:20;;29148:27;:::i;:::-;;;;-1:-1:-1;;29193:46:0;;;20363:25:1;;;20419:2;20404:18;;20397:34;;;-1:-1:-1;;;;;29193:46:0;;;;;;;;;;;;;;20336:18:1;29193:46:0;;;;;;;29252:68;29283:8;29293:4;29299:2;29303;29307:6;29315:4;29252:30;:68::i;:::-;28508:820;;;;;;;:::o;38961:198::-;39081:16;;;39095:1;39081:16;;;;;;;;;39027;;39056:22;;39081:16;;;;;;;;;;;;-1:-1:-1;39081:16:0;39056:41;;39119:7;39108:5;39114:1;39108:8;;;;;;-1:-1:-1;;;39108:8:0;;;;;;;;;;;;;;;;;;:18;39146:5;38961:198;-1:-1:-1;;38961:198:0:o;37388:744::-;-1:-1:-1;;;;;37603:13:0;;7349:20;7397:8;37599:526;;37639:72;;-1:-1:-1;;;37639:72:0;;-1:-1:-1;;;;;37639:38:0;;;;;:72;;37678:8;;37688:4;;37694:2;;37698:6;;37706:4;;37639:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37639:72:0;;;;;;;;-1:-1:-1;;37639:72:0;;;;;;;;;;;;:::i;:::-;;;37635:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;37987:6;37980:14;;-1:-1:-1;;;37980:14:0;;;;;;;;:::i;37635:479::-;;;38036:62;;-1:-1:-1;;;38036:62:0;;13173:2:1;38036:62:0;;;13155:21:1;13212:2;13192:18;;;13185:30;13251:34;13231:18;;;13224:62;-1:-1:-1;;;13302:18:1;;;13295:50;13362:19;;38036:62:0;13145:242:1;37635:479:0;-1:-1:-1;;;;;;37761:55:0;;-1:-1:-1;;;37761:55:0;37757:154;;37841:50;;-1:-1:-1;;;37841:50:0;;;;;;;:::i;38140:813::-;-1:-1:-1;;;;;38380:13:0;;7349:20;7397:8;38376:570;;38416:79;;-1:-1:-1;;;38416:79:0;;-1:-1:-1;;;;;38416:43:0;;;;;:79;;38460:8;;38470:4;;38476:3;;38481:7;;38490:4;;38416:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38416:79:0;;;;;;;;-1:-1:-1;;38416:79:0;;;;;;;;;;;;:::i;:::-;;;38412:523;;;;:::i;:::-;-1:-1:-1;;;;;;38577:60:0;;-1:-1:-1;;;38577:60:0;38573:159;;38662:50;;-1:-1:-1;;;38662:50:0;;;;;;;:::i;1982:675::-;2065:7;2108:4;2065:7;2123:497;2147:5;:12;2143:1;:16;2123:497;;;2181:20;2204:5;2210:1;2204:8;;;;;;-1:-1:-1;;;2204:8:0;;;;;;;;;;;;;;;2181:31;;2247:12;2231;:28;2227:382;;2733:13;2783:15;;;2819:4;2812:15;;;2866:4;2850:21;;2359:57;;2227:382;;;2733:13;2783:15;;;2819:4;2812:15;;;2866:4;2850:21;;2536:57;;2227:382;-1:-1:-1;2161:3:0;;;;:::i;:::-;;;;2123:497;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:468:1;78:5;112:18;104:6;101:30;98:2;;;134:18;;:::i;:::-;183:2;177:9;195:69;252:2;231:15;;-1:-1:-1;;227:29:1;258:4;223:40;177:9;195:69;:::i;:::-;282:6;273:15;;312:6;304;297:22;352:3;343:6;338:3;334:16;331:25;328:2;;;369:1;366;359:12;328:2;419:6;414:3;407:4;399:6;395:17;382:44;474:1;467:4;458:6;450;446:19;442:30;435:41;;88:394;;;;;:::o;487:173::-;555:20;;-1:-1:-1;;;;;604:31:1;;594:42;;584:2;;650:1;647;640:12;584:2;536:124;;;:::o;665:755::-;719:5;772:3;765:4;757:6;753:17;749:27;739:2;;794:5;787;780:20;739:2;834:6;821:20;860:4;883:43;923:2;883:43;:::i;:::-;955:2;949:9;967:31;995:2;987:6;967:31;:::i;:::-;1033:18;;;1067:15;;;;-1:-1:-1;1102:15:1;;;1152:1;1148:10;;;1136:23;;1132:32;;1129:41;-1:-1:-1;1126:2:1;;;1187:5;1180;1173:20;1126:2;1213:5;1227:163;1241:2;1238:1;1235:9;1227:163;;;1298:17;;1286:30;;1336:12;;;;1368;;;;1259:1;1252:9;1227:163;;;-1:-1:-1;1408:6:1;;729:691;-1:-1:-1;;;;;;;729:691:1:o;1425:160::-;1490:20;;1546:13;;1539:21;1529:32;;1519:2;;1575:1;1572;1565:12;1590:228;1632:5;1685:3;1678:4;1670:6;1666:17;1662:27;1652:2;;1707:5;1700;1693:20;1652:2;1733:79;1808:3;1799:6;1786:20;1779:4;1771:6;1767:17;1733:79;:::i;:::-;1724:88;1642:176;-1:-1:-1;;;1642:176:1:o;1823:196::-;1882:6;1935:2;1923:9;1914:7;1910:23;1906:32;1903:2;;;1956:6;1948;1941:22;1903:2;1984:29;2003:9;1984:29;:::i;2024:270::-;2092:6;2100;2153:2;2141:9;2132:7;2128:23;2124:32;2121:2;;;2174:6;2166;2159:22;2121:2;2202:29;2221:9;2202:29;:::i;:::-;2192:39;;2250:38;2284:2;2273:9;2269:18;2250:38;:::i;:::-;2240:48;;2111:183;;;;;:::o;2299:983::-;2453:6;2461;2469;2477;2485;2538:3;2526:9;2517:7;2513:23;2509:33;2506:2;;;2560:6;2552;2545:22;2506:2;2588:29;2607:9;2588:29;:::i;:::-;2578:39;;2636:38;2670:2;2659:9;2655:18;2636:38;:::i;:::-;2626:48;;2725:2;2714:9;2710:18;2697:32;2748:18;2789:2;2781:6;2778:14;2775:2;;;2810:6;2802;2795:22;2775:2;2838:61;2891:7;2882:6;2871:9;2867:22;2838:61;:::i;:::-;2828:71;;2952:2;2941:9;2937:18;2924:32;2908:48;;2981:2;2971:8;2968:16;2965:2;;;3002:6;2994;2987:22;2965:2;3030:63;3085:7;3074:8;3063:9;3059:24;3030:63;:::i;:::-;3020:73;;3146:3;3135:9;3131:19;3118:33;3102:49;;3176:2;3166:8;3163:16;3160:2;;;3197:6;3189;3182:22;3160:2;;3225:51;3268:7;3257:8;3246:9;3242:24;3225:51;:::i;:::-;3215:61;;;2496:786;;;;;;;;:::o;3287:626::-;3391:6;3399;3407;3415;3423;3476:3;3464:9;3455:7;3451:23;3447:33;3444:2;;;3498:6;3490;3483:22;3444:2;3526:29;3545:9;3526:29;:::i;:::-;3516:39;;3574:38;3608:2;3597:9;3593:18;3574:38;:::i;:::-;3564:48;;3659:2;3648:9;3644:18;3631:32;3621:42;;3710:2;3699:9;3695:18;3682:32;3672:42;;3765:3;3754:9;3750:19;3737:33;3793:18;3785:6;3782:30;3779:2;;;3830:6;3822;3815:22;3779:2;3858:49;3899:7;3890:6;3879:9;3875:22;3858:49;:::i;3918:264::-;3983:6;3991;4044:2;4032:9;4023:7;4019:23;4015:32;4012:2;;;4065:6;4057;4050:22;4012:2;4093:29;4112:9;4093:29;:::i;:::-;4083:39;;4141:35;4172:2;4161:9;4157:18;4141:35;:::i;4187:264::-;4255:6;4263;4316:2;4304:9;4295:7;4291:23;4287:32;4284:2;;;4337:6;4329;4322:22;4284:2;4365:29;4384:9;4365:29;:::i;:::-;4355:39;4441:2;4426:18;;;;4413:32;;-1:-1:-1;;;4274:177:1:o;4456:332::-;4533:6;4541;4549;4602:2;4590:9;4581:7;4577:23;4573:32;4570:2;;;4623:6;4615;4608:22;4570:2;4651:29;4670:9;4651:29;:::i;:::-;4641:39;4727:2;4712:18;;4699:32;;-1:-1:-1;4778:2:1;4763:18;;;4750:32;;4560:228;-1:-1:-1;;;4560:228:1:o;4793:1274::-;4911:6;4919;4972:2;4960:9;4951:7;4947:23;4943:32;4940:2;;;4993:6;4985;4978:22;4940:2;5038:9;5025:23;5067:18;5108:2;5100:6;5097:14;5094:2;;;5129:6;5121;5114:22;5094:2;5172:6;5161:9;5157:22;5147:32;;5217:7;5210:4;5206:2;5202:13;5198:27;5188:2;;5244:6;5236;5229:22;5188:2;5285;5272:16;5307:4;5330:43;5370:2;5330:43;:::i;:::-;5402:2;5396:9;5414:31;5442:2;5434:6;5414:31;:::i;:::-;5480:18;;;5514:15;;;;-1:-1:-1;5549:11:1;;;5591:1;5587:10;;;5579:19;;5575:28;;5572:41;-1:-1:-1;5569:2:1;;;5631:6;5623;5616:22;5569:2;5658:6;5649:15;;5673:169;5687:2;5684:1;5681:9;5673:169;;;5744:23;5763:3;5744:23;:::i;:::-;5732:36;;5705:1;5698:9;;;;;5788:12;;;;5820;;5673:169;;;-1:-1:-1;5861:6:1;-1:-1:-1;;5905:18:1;;5892:32;;-1:-1:-1;;5936:16:1;;;5933:2;;;5970:6;5962;5955:22;5933:2;;5998:63;6053:7;6042:8;6031:9;6027:24;5998:63;:::i;:::-;5988:73;;;4930:1137;;;;;:::o;6072:739::-;6167:6;6175;6183;6236:2;6224:9;6215:7;6211:23;6207:32;6204:2;;;6257:6;6249;6242:22;6204:2;6302:9;6289:23;6331:18;6372:2;6364:6;6361:14;6358:2;;;6393:6;6385;6378:22;6358:2;6436:6;6425:9;6421:22;6411:32;;6481:7;6474:4;6470:2;6466:13;6462:27;6452:2;;6508:6;6500;6493:22;6452:2;6553;6540:16;6579:2;6571:6;6568:14;6565:2;;;6600:6;6592;6585:22;6565:2;6660:7;6653:4;6643:6;6640:1;6636:14;6632:2;6628:23;6624:34;6621:47;6618:2;;;6686:6;6678;6671:22;6618:2;6722:4;6714:13;;;;6746:6;;-1:-1:-1;6784:20:1;;;;6771:34;;6194:617;-1:-1:-1;;;;6194:617:1:o;6816:255::-;6874:6;6927:2;6915:9;6906:7;6902:23;6898:32;6895:2;;;6948:6;6940;6933:22;6895:2;6992:9;6979:23;7011:30;7035:5;7011:30;:::i;7076:259::-;7145:6;7198:2;7186:9;7177:7;7173:23;7169:32;7166:2;;;7219:6;7211;7204:22;7166:2;7256:9;7250:16;7275:30;7299:5;7275:30;:::i;7340:190::-;7399:6;7452:2;7440:9;7431:7;7427:23;7423:32;7420:2;;;7473:6;7465;7458:22;7420:2;-1:-1:-1;7501:23:1;;7410:120;-1:-1:-1;7410:120:1:o;7535:258::-;7600:6;7608;7661:2;7649:9;7640:7;7636:23;7632:32;7629:2;;;7682:6;7674;7667:22;7629:2;7723:9;7710:23;7700:33;;7752:35;7783:2;7772:9;7768:18;7752:35;:::i;7798:258::-;7866:6;7874;7927:2;7915:9;7906:7;7902:23;7898:32;7895:2;;;7948:6;7940;7933:22;7895:2;-1:-1:-1;;7976:23:1;;;8046:2;8031:18;;;8018:32;;-1:-1:-1;7885:171:1:o;8061:548::-;8139:6;8147;8200:2;8188:9;8179:7;8175:23;8171:32;8168:2;;;8221:6;8213;8206:22;8168:2;8262:9;8249:23;8239:33;;8323:2;8312:9;8308:18;8295:32;8350:18;8342:6;8339:30;8336:2;;;8387:6;8379;8372:22;8336:2;8415:22;;8468:4;8460:13;;8456:27;-1:-1:-1;8446:2:1;;8502:6;8494;8487:22;8446:2;8530:73;8595:7;8590:2;8577:16;8572:2;8568;8564:11;8530:73;:::i;8877:437::-;8930:3;8968:5;8962:12;8995:6;8990:3;8983:19;9021:4;9050:2;9045:3;9041:12;9034:19;;9087:2;9080:5;9076:14;9108:3;9120:169;9134:6;9131:1;9128:13;9120:169;;;9195:13;;9183:26;;9229:12;;;;9264:15;;;;9156:1;9149:9;9120:169;;;-1:-1:-1;9305:3:1;;8938:376;-1:-1:-1;;;;;8938:376:1:o;9319:475::-;9360:3;9398:5;9392:12;9425:6;9420:3;9413:19;9450:3;9462:162;9476:6;9473:1;9470:13;9462:162;;;9538:4;9594:13;;;9590:22;;9584:29;9566:11;;;9562:20;;9555:59;9491:12;9462:162;;;9642:6;9639:1;9636:13;9633:2;;;9708:3;9701:4;9692:6;9687:3;9683:16;9679:27;9672:40;9633:2;-1:-1:-1;9776:2:1;9755:15;-1:-1:-1;;9751:29:1;9742:39;;;;9783:4;9738:50;;9368:426;-1:-1:-1;;9368:426:1:o;10241:826::-;-1:-1:-1;;;;;10638:15:1;;;10620:34;;10690:15;;10685:2;10670:18;;10663:43;10600:3;10737:2;10722:18;;10715:31;;;10563:4;;10769:57;;10806:19;;10798:6;10769:57;:::i;:::-;10874:9;10866:6;10862:22;10857:2;10846:9;10842:18;10835:50;10908:44;10945:6;10937;10908:44;:::i;:::-;10894:58;;11001:9;10993:6;10989:22;10983:3;10972:9;10968:19;10961:51;11029:32;11054:6;11046;11029:32;:::i;:::-;11021:40;10572:495;-1:-1:-1;;;;;;;;10572:495:1:o;11072:560::-;-1:-1:-1;;;;;11369:15:1;;;11351:34;;11421:15;;11416:2;11401:18;;11394:43;11468:2;11453:18;;11446:34;;;11511:2;11496:18;;11489:34;;;11331:3;11554;11539:19;;11532:32;;;11294:4;;11581:45;;11606:19;;11598:6;11581:45;:::i;:::-;11573:53;11303:329;-1:-1:-1;;;;;;;11303:329:1:o;11637:261::-;11816:2;11805:9;11798:21;11779:4;11836:56;11888:2;11877:9;11873:18;11865:6;11836:56;:::i;11903:465::-;12160:2;12149:9;12142:21;12123:4;12186:56;12238:2;12227:9;12223:18;12215:6;12186:56;:::i;:::-;12290:9;12282:6;12278:22;12273:2;12262:9;12258:18;12251:50;12318:44;12355:6;12347;12318:44;:::i;:::-;12310:52;12132:236;-1:-1:-1;;;;;12132:236:1:o;12747:219::-;12896:2;12885:9;12878:21;12859:4;12916:44;12956:2;12945:9;12941:18;12933:6;12916:44;:::i;13392:404::-;13594:2;13576:21;;;13633:2;13613:18;;;13606:30;13672:34;13667:2;13652:18;;13645:62;-1:-1:-1;;;13738:2:1;13723:18;;13716:38;13786:3;13771:19;;13566:230::o;16080:401::-;16282:2;16264:21;;;16321:2;16301:18;;;16294:30;16360:34;16355:2;16340:18;;16333:62;-1:-1:-1;;;16426:2:1;16411:18;;16404:35;16471:3;16456:19;;16254:227::o;16905:406::-;17107:2;17089:21;;;17146:2;17126:18;;;17119:30;17185:34;17180:2;17165:18;;17158:62;-1:-1:-1;;;17251:2:1;17236:18;;17229:40;17301:3;17286:19;;17079:232::o;17316:356::-;17518:2;17500:21;;;17537:18;;;17530:30;17596:34;17591:2;17576:18;;17569:62;17663:2;17648:18;;17490:182::o;20442:183::-;20502:4;20535:18;20527:6;20524:30;20521:2;;;20557:18;;:::i;:::-;-1:-1:-1;20602:1:1;20598:14;20614:4;20594:25;;20511:114::o;20630:128::-;20670:3;20701:1;20697:6;20694:1;20691:13;20688:2;;;20707:18;;:::i;:::-;-1:-1:-1;20743:9:1;;20678:80::o;20763:380::-;20842:1;20838:12;;;;20885;;;20906:2;;20960:4;20952:6;20948:17;20938:27;;20906:2;21013;21005:6;21002:14;20982:18;20979:38;20976:2;;;21059:10;21054:3;21050:20;21047:1;21040:31;21094:4;21091:1;21084:15;21122:4;21119:1;21112:15;20976:2;;20818:325;;;:::o;21148:249::-;21258:2;21239:13;;-1:-1:-1;;21235:27:1;21223:40;;21293:18;21278:34;;21314:22;;;21275:62;21272:2;;;21340:18;;:::i;:::-;21376:2;21369:22;-1:-1:-1;;21195:202:1:o;21402:135::-;21441:3;-1:-1:-1;;21462:17:1;;21459:2;;;21482:18;;:::i;:::-;-1:-1:-1;21529:1:1;21518:13;;21449:88::o;21542:127::-;21603:10;21598:3;21594:20;21591:1;21584:31;21634:4;21631:1;21624:15;21658:4;21655:1;21648:15;21674:127;21735:10;21730:3;21726:20;21723:1;21716:31;21766:4;21763:1;21756:15;21790:4;21787:1;21780:15;21806:185;21841:3;21883:1;21865:16;21862:23;21859:2;;;21933:1;21928:3;21923;21908:27;21964:10;21959:3;21955:20;21859:2;21849:142;:::o;21996:671::-;22035:3;22077:4;22059:16;22056:26;22053:2;;;22043:624;:::o;22053:2::-;22119;22113:9;-1:-1:-1;;22184:16:1;22180:25;;22177:1;22113:9;22156:50;22235:4;22229:11;22259:16;22294:18;22365:2;22358:4;22350:6;22346:17;22343:25;22338:2;22330:6;22327:14;22324:45;22321:2;;;22372:5;;;;;22043:624;:::o;22321:2::-;22409:6;22403:4;22399:17;22388:28;;22445:3;22439:10;22472:2;22464:6;22461:14;22458:2;;;22478:5;;;;;;22043:624;:::o;22458:2::-;22562;22543:16;22537:4;22533:27;22529:36;22522:4;22513:6;22508:3;22504:16;22500:27;22497:69;22494:2;;;22569:5;;;;;;22043:624;:::o;22494:2::-;22585:57;22636:4;22627:6;22619;22615:19;22611:30;22605:4;22585:57;:::i;:::-;-1:-1:-1;22658:3:1;;22043:624;-1:-1:-1;;;;;22043:624:1:o;22672:131::-;-1:-1:-1;;;;;;22746:32:1;;22736:43;;22726:2;;22793:1;22790;22783:12
Swarm Source
ipfs://03e375ff08cb5ed99121a0c176f228937eae9cae3341a45bd388b299d4f97f04
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.