ERC-721
Overview
Max Total Supply
4,821 WAVERIDER
Holders
4,177
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
34 WAVERIDERLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
waveriders
Compiler Version
v0.8.15+commit.e14f2714
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-17 */ /** *Submitted for verification at Etherscan.io on 2022-05-19 */ // SPDX-License-Identifier: MIT // File: contracts/StartTokenIdHelper.sol // ERC721A Contracts v3.3.0 // Creators: Chiru Labs pragma solidity ^0.8.4; /** * This Helper is used to return a dynmamic value in the overriden _startTokenId() function. * Extending this Helper before the ERC721A contract give us access to the herein set `startTokenId` * to be returned by the overriden `_startTokenId()` function of ERC721A in the ERC721AStartTokenId mocks. */ contract StartTokenIdHelper { uint256 public startTokenId; constructor(uint256 startTokenId_) { startTokenId = startTokenId_; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: contracts/IERC721A.sol // ERC721A Contracts v3.3.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A is IERC721, IERC721Metadata { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * The caller cannot approve to the current owner. */ error ApprovalToCurrentOwner(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); } // File: contracts/ERC721A.sol // ERC721A Contracts v3.3.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721A { using Address for address; using Strings for uint256; // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString(), ".json")) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner) if(!isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.isContract()) if(!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex < end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { AddressData storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: contracts/waveriders.sol pragma solidity ^0.8.4; contract waveriders is StartTokenIdHelper, ERC721A, Ownable, ReentrancyGuard { using Strings for uint256; string public wavelink; bool public riding = false; uint256 public riders = 10000; uint256 public rideronwave = 1; mapping(address => uint256) public ridingcount; constructor() StartTokenIdHelper(1) ERC721A("waveriders", "WAVERIDER") {} function _baseURI() internal view override returns (string memory) { return wavelink; } function getwaverider() external nonReentrant { uint256 totalriders = totalSupply(); require(riding); require(totalriders + rideronwave <= riders); require(msg.sender == tx.origin); require(ridingcount[msg.sender] < rideronwave); _safeMint(msg.sender, rideronwave); ridingcount[msg.sender] += rideronwave; } function flyingwaverider(address to, uint256 _riders) public onlyOwner { uint256 totalriders = totalSupply(); require(totalriders + _riders <= riders); _safeMint(to, _riders); } function startriding(bool _riding) external onlyOwner { riding = _riding; } function howmanyriders(uint256 _rideronwave) external onlyOwner { rideronwave = _rideronwave; } function sharewavelink(string memory _wavelink) external onlyOwner { wavelink = _wavelink; } function aboutfunds() public payable onlyOwner { uint256 amount = address(this).balance; Address.sendValue(payable(msg.sender), amount); } function _startTokenId() internal view override returns (uint256) { return startTokenId; } function exists(uint256 tokenId) public view returns (bool) { return _exists(tokenId); } function burn(uint256 tokenId, bool approvalCheck) public onlyOwner { _burn(tokenId, approvalCheck); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"aboutfunds","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"approvalCheck","type":"bool"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"_riders","type":"uint256"}],"name":"flyingwaverider","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getwaverider","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rideronwave","type":"uint256"}],"name":"howmanyriders","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rideronwave","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"riders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"riding","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ridingcount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_wavelink","type":"string"}],"name":"sharewavelink","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_riding","type":"bool"}],"name":"startriding","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wavelink","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526000600c60006101000a81548160ff021916908315150217905550612710600d556001600e553480156200003757600080fd5b506040518060400160405280600a81526020017f77617665726964657273000000000000000000000000000000000000000000008152506040518060400160405280600981526020017f5741564552494445520000000000000000000000000000000000000000000000815250600180600081905550508160039081620000bf919062000469565b508060049081620000d1919062000469565b50620000e26200011860201b60201c565b60018190555050506200010a620000fe6200012160201b60201c565b6200012960201b60201c565b6001600a8190555062000550565b60008054905090565b600033905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200027157607f821691505b60208210810362000287576200028662000229565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620002f17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002b2565b620002fd8683620002b2565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200034a620003446200033e8462000315565b6200031f565b62000315565b9050919050565b6000819050919050565b620003668362000329565b6200037e620003758262000351565b848454620002bf565b825550505050565b600090565b6200039562000386565b620003a28184846200035b565b505050565b5b81811015620003ca57620003be6000826200038b565b600181019050620003a8565b5050565b601f8211156200041957620003e3816200028d565b620003ee84620002a2565b81016020851015620003fe578190505b620004166200040d85620002a2565b830182620003a7565b50505b505050565b600082821c905092915050565b60006200043e600019846008026200041e565b1980831691505092915050565b60006200045983836200042b565b9150826002028217905092915050565b6200047482620001ef565b67ffffffffffffffff81111562000490576200048f620001fa565b5b6200049c825462000258565b620004a9828285620003ce565b600060209050601f831160018114620004e15760008415620004cc578287015190505b620004d885826200044b565b86555062000548565b601f198416620004f1866200028d565b60005b828110156200051b57848901518255600182019150602085019450602081019050620004f4565b868310156200053b578489015162000537601f8916826200042b565b8355505b6001600288020188555050505b505050505050565b613cc280620005606000396000f3fe6080604052600436106101d85760003560e01c806368bb0f6b11610102578063b88d4fde11610095578063e985e9c511610064578063e985e9c51461069d578063f2fde38b146106da578063f8f5d75b14610703578063fe662d921461071a576101d8565b8063b88d4fde146105e1578063c4efd9d61461060a578063c87b56dd14610635578063e6798baa14610672576101d8565b80638da5cb5b116100d15780638da5cb5b1461053957806395d89b41146105645780639fac68cb1461058f578063a22cb465146105b8576101d8565b806368bb0f6b146104b257806370a08231146104bc578063715018a6146104f95780638143475a14610510576101d8565b806342842e0e1161017a57806358dc83611161014957806358dc8361146103e45780635abbc9cd1461040d5780635d561c03146104385780636352211e14610475576101d8565b806342842e0e146103285780634f558e791461035157806356dc4f971461038e57806357368dce146103b9576101d8565b8063095ea7b3116101b6578063095ea7b31461028257806318160ddd146102ab57806323b872dd146102d6578063364e5095146102ff576101d8565b806301ffc9a7146101dd57806306fdde031461021a578063081812fc14610245575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190612cf7565b610743565b6040516102119190612d3f565b60405180910390f35b34801561022657600080fd5b5061022f610825565b60405161023c9190612df3565b60405180910390f35b34801561025157600080fd5b5061026c60048036038101906102679190612e4b565b6108b7565b6040516102799190612eb9565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a49190612f00565b610933565b005b3480156102b757600080fd5b506102c0610a37565b6040516102cd9190612f4f565b60405180910390f35b3480156102e257600080fd5b506102fd60048036038101906102f89190612f6a565b610a4e565b005b34801561030b57600080fd5b5061032660048036038101906103219190612fe9565b610a5e565b005b34801561033457600080fd5b5061034f600480360381019061034a9190612f6a565b610af7565b005b34801561035d57600080fd5b5061037860048036038101906103739190612e4b565b610b17565b6040516103859190612d3f565b60405180910390f35b34801561039a57600080fd5b506103a3610b29565b6040516103b09190612f4f565b60405180910390f35b3480156103c557600080fd5b506103ce610b2f565b6040516103db9190612f4f565b60405180910390f35b3480156103f057600080fd5b5061040b6004803603810190610406919061314b565b610b35565b005b34801561041957600080fd5b50610422610bc4565b60405161042f9190612df3565b60405180910390f35b34801561044457600080fd5b5061045f600480360381019061045a9190613194565b610c52565b60405161046c9190612f4f565b60405180910390f35b34801561048157600080fd5b5061049c60048036038101906104979190612e4b565b610c6a565b6040516104a99190612eb9565b60405180910390f35b6104ba610c80565b005b3480156104c857600080fd5b506104e360048036038101906104de9190613194565b610d0e565b6040516104f09190612f4f565b60405180910390f35b34801561050557600080fd5b5061050e610ddd565b005b34801561051c57600080fd5b5061053760048036038101906105329190612f00565b610e65565b005b34801561054557600080fd5b5061054e610f16565b60405161055b9190612eb9565b60405180910390f35b34801561057057600080fd5b50610579610f40565b6040516105869190612df3565b60405180910390f35b34801561059b57600080fd5b506105b660048036038101906105b191906131c1565b610fd2565b005b3480156105c457600080fd5b506105df60048036038101906105da9190613201565b61105c565b005b3480156105ed57600080fd5b50610608600480360381019061060391906132e2565b6111d3565b005b34801561061657600080fd5b5061061f61124b565b60405161062c9190612d3f565b60405180910390f35b34801561064157600080fd5b5061065c60048036038101906106579190612e4b565b61125e565b6040516106699190612df3565b60405180910390f35b34801561067e57600080fd5b506106876112fc565b6040516106949190612f4f565b60405180910390f35b3480156106a957600080fd5b506106c460048036038101906106bf9190613365565b611302565b6040516106d19190612d3f565b60405180910390f35b3480156106e657600080fd5b5061070160048036038101906106fc9190613194565b611396565b005b34801561070f57600080fd5b5061071861148d565b005b34801561072657600080fd5b50610741600480360381019061073c9190612e4b565b61160f565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061080e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061081e575061081d82611695565b5b9050919050565b606060038054610834906133d4565b80601f0160208091040260200160405190810160405280929190818152602001828054610860906133d4565b80156108ad5780601f10610882576101008083540402835291602001916108ad565b820191906000526020600020905b81548152906001019060200180831161089057829003601f168201915b5050505050905090565b60006108c2826116ff565b6108f8576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061093e82610c6a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036109a5576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109c461174d565b73ffffffffffffffffffffffffffffffffffffffff1614610a27576109f0816109eb61174d565b611302565b610a26576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b610a32838383611755565b505050565b6000610a41611807565b6002546001540303905090565b610a59838383611810565b505050565b610a6661174d565b73ffffffffffffffffffffffffffffffffffffffff16610a84610f16565b73ffffffffffffffffffffffffffffffffffffffff1614610ada576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad190613451565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b610b12838383604051806020016040528060008152506111d3565b505050565b6000610b22826116ff565b9050919050565b600e5481565b600d5481565b610b3d61174d565b73ffffffffffffffffffffffffffffffffffffffff16610b5b610f16565b73ffffffffffffffffffffffffffffffffffffffff1614610bb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba890613451565b60405180910390fd5b80600b9081610bc0919061361d565b5050565b600b8054610bd1906133d4565b80601f0160208091040260200160405190810160405280929190818152602001828054610bfd906133d4565b8015610c4a5780601f10610c1f57610100808354040283529160200191610c4a565b820191906000526020600020905b815481529060010190602001808311610c2d57829003601f168201915b505050505081565b600f6020528060005260406000206000915090505481565b6000610c7582611cc4565b600001519050919050565b610c8861174d565b73ffffffffffffffffffffffffffffffffffffffff16610ca6610f16565b73ffffffffffffffffffffffffffffffffffffffff1614610cfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf390613451565b60405180910390fd5b6000479050610d0b3382611f4f565b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d75576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610de561174d565b73ffffffffffffffffffffffffffffffffffffffff16610e03610f16565b73ffffffffffffffffffffffffffffffffffffffff1614610e59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5090613451565b60405180910390fd5b610e636000612043565b565b610e6d61174d565b73ffffffffffffffffffffffffffffffffffffffff16610e8b610f16565b73ffffffffffffffffffffffffffffffffffffffff1614610ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed890613451565b60405180910390fd5b6000610eeb610a37565b9050600d548282610efc919061371e565b1115610f0757600080fd5b610f118383612109565b505050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610f4f906133d4565b80601f0160208091040260200160405190810160405280929190818152602001828054610f7b906133d4565b8015610fc85780601f10610f9d57610100808354040283529160200191610fc8565b820191906000526020600020905b815481529060010190602001808311610fab57829003601f168201915b5050505050905090565b610fda61174d565b73ffffffffffffffffffffffffffffffffffffffff16610ff8610f16565b73ffffffffffffffffffffffffffffffffffffffff161461104e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104590613451565b60405180910390fd5b6110588282612127565b5050565b61106461174d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110c8576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600860006110d561174d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661118261174d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111c79190612d3f565b60405180910390a35050565b6111de848484611810565b6111fd8373ffffffffffffffffffffffffffffffffffffffff16612516565b156112455761120e84848484612539565b611244576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600c60009054906101000a900460ff1681565b6060611269826116ff565b61129f576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006112a9612689565b905060008151036112c957604051806020016040528060008152506112f4565b806112d38461271b565b6040516020016112e49291906137fc565b6040516020818303038152906040525b915050919050565b60005481565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61139e61174d565b73ffffffffffffffffffffffffffffffffffffffff166113bc610f16565b73ffffffffffffffffffffffffffffffffffffffff1614611412576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140990613451565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611481576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114789061389d565b60405180910390fd5b61148a81612043565b50565b6002600a54036114d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c990613909565b60405180910390fd5b6002600a8190555060006114e4610a37565b9050600c60009054906101000a900460ff166114ff57600080fd5b600d54600e5482611510919061371e565b111561151b57600080fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461155357600080fd5b600e54600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106115a057600080fd5b6115ac33600e54612109565b600e54600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115fd919061371e565b92505081905550506001600a81905550565b61161761174d565b73ffffffffffffffffffffffffffffffffffffffff16611635610f16565b73ffffffffffffffffffffffffffffffffffffffff161461168b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168290613451565b60405180910390fd5b80600e8190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161170a611807565b11158015611719575060015482105b8015611746575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60008054905090565b600061181b82611cc4565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611886576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166118a761174d565b73ffffffffffffffffffffffffffffffffffffffff1614806118d657506118d5856118d061174d565b611302565b5b8061191b57506118e461174d565b73ffffffffffffffffffffffffffffffffffffffff16611903846108b7565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611954576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036119ba576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119c7858585600161287b565b6119d360008487611755565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611c52576001548214611c5157878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611cbd8585856001612881565b5050505050565b611ccc612c48565b600082905080611cda611807565b11611f1857600154811015611f17576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611f1557600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611df9578092505050611f4a565b5b600115611f1457818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611f0f578092505050611f4a565b611dfa565b5b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b80471015611f92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8990613975565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611fb8906139c6565b60006040518083038185875af1925050503d8060008114611ff5576040519150601f19603f3d011682016040523d82523d6000602084013e611ffa565b606091505b505090508061203e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203590613a4d565b60405180910390fd5b505050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612123828260405180602001604052806000815250612887565b5050565b600061213283611cc4565b905060008160000151905082156122135760008173ffffffffffffffffffffffffffffffffffffffff1661216461174d565b73ffffffffffffffffffffffffffffffffffffffff16148061219357506121928261218d61174d565b611302565b5b806121d857506121a161174d565b73ffffffffffffffffffffffffffffffffffffffff166121c0866108b7565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612211576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61222181600086600161287b565b61222d60008583611755565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060018160000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060018160000160108282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008781526020019081526020016000209050828160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600181600001601c6101000a81548160ff02191690831515021790555060006001870190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361249057600154821461248f57848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b5050505083600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124fe816000866001612881565b60026000815480929190600101919050555050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261255f61174d565b8786866040518563ffffffff1660e01b81526004016125819493929190613ac2565b6020604051808303816000875af19250505080156125bd57506040513d601f19601f820116820180604052508101906125ba9190613b23565b60015b612636573d80600081146125ed576040519150601f19603f3d011682016040523d82523d6000602084013e6125f2565b606091505b50600081510361262e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600b8054612698906133d4565b80601f01602080910402602001604051908101604052809291908181526020018280546126c4906133d4565b80156127115780601f106126e657610100808354040283529160200191612711565b820191906000526020600020905b8154815290600101906020018083116126f457829003601f168201915b5050505050905090565b606060008203612762576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612876565b600082905060005b6000821461279457808061277d90613b50565b915050600a8261278d9190613bc7565b915061276a565b60008167ffffffffffffffff8111156127b0576127af613020565b5b6040519080825280601f01601f1916602001820160405280156127e25781602001600182028036833780820191505090505b5090505b6000851461286f576001826127fb9190613bf8565b9150600a8561280a9190613c2c565b6030612816919061371e565b60f81b81838151811061282c5761282b613c5d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128689190613bc7565b94506127e6565b8093505050505b919050565b50505050565b50505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036128f4576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000830361292e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61293b600085838661287b565b82600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008482019050612afc8673ffffffffffffffffffffffffffffffffffffffff16612516565b15612bc1575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b716000878480600101955087612539565b612ba7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210612b02578260015414612bbc57600080fd5b612c2c565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612bc2575b816001819055505050612c426000858386612881565b50505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612cd481612c9f565b8114612cdf57600080fd5b50565b600081359050612cf181612ccb565b92915050565b600060208284031215612d0d57612d0c612c95565b5b6000612d1b84828501612ce2565b91505092915050565b60008115159050919050565b612d3981612d24565b82525050565b6000602082019050612d546000830184612d30565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612d94578082015181840152602081019050612d79565b83811115612da3576000848401525b50505050565b6000601f19601f8301169050919050565b6000612dc582612d5a565b612dcf8185612d65565b9350612ddf818560208601612d76565b612de881612da9565b840191505092915050565b60006020820190508181036000830152612e0d8184612dba565b905092915050565b6000819050919050565b612e2881612e15565b8114612e3357600080fd5b50565b600081359050612e4581612e1f565b92915050565b600060208284031215612e6157612e60612c95565b5b6000612e6f84828501612e36565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612ea382612e78565b9050919050565b612eb381612e98565b82525050565b6000602082019050612ece6000830184612eaa565b92915050565b612edd81612e98565b8114612ee857600080fd5b50565b600081359050612efa81612ed4565b92915050565b60008060408385031215612f1757612f16612c95565b5b6000612f2585828601612eeb565b9250506020612f3685828601612e36565b9150509250929050565b612f4981612e15565b82525050565b6000602082019050612f646000830184612f40565b92915050565b600080600060608486031215612f8357612f82612c95565b5b6000612f9186828701612eeb565b9350506020612fa286828701612eeb565b9250506040612fb386828701612e36565b9150509250925092565b612fc681612d24565b8114612fd157600080fd5b50565b600081359050612fe381612fbd565b92915050565b600060208284031215612fff57612ffe612c95565b5b600061300d84828501612fd4565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61305882612da9565b810181811067ffffffffffffffff8211171561307757613076613020565b5b80604052505050565b600061308a612c8b565b9050613096828261304f565b919050565b600067ffffffffffffffff8211156130b6576130b5613020565b5b6130bf82612da9565b9050602081019050919050565b82818337600083830152505050565b60006130ee6130e98461309b565b613080565b90508281526020810184848401111561310a5761310961301b565b5b6131158482856130cc565b509392505050565b600082601f83011261313257613131613016565b5b81356131428482602086016130db565b91505092915050565b60006020828403121561316157613160612c95565b5b600082013567ffffffffffffffff81111561317f5761317e612c9a565b5b61318b8482850161311d565b91505092915050565b6000602082840312156131aa576131a9612c95565b5b60006131b884828501612eeb565b91505092915050565b600080604083850312156131d8576131d7612c95565b5b60006131e685828601612e36565b92505060206131f785828601612fd4565b9150509250929050565b6000806040838503121561321857613217612c95565b5b600061322685828601612eeb565b925050602061323785828601612fd4565b9150509250929050565b600067ffffffffffffffff82111561325c5761325b613020565b5b61326582612da9565b9050602081019050919050565b600061328561328084613241565b613080565b9050828152602081018484840111156132a1576132a061301b565b5b6132ac8482856130cc565b509392505050565b600082601f8301126132c9576132c8613016565b5b81356132d9848260208601613272565b91505092915050565b600080600080608085870312156132fc576132fb612c95565b5b600061330a87828801612eeb565b945050602061331b87828801612eeb565b935050604061332c87828801612e36565b925050606085013567ffffffffffffffff81111561334d5761334c612c9a565b5b613359878288016132b4565b91505092959194509250565b6000806040838503121561337c5761337b612c95565b5b600061338a85828601612eeb565b925050602061339b85828601612eeb565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806133ec57607f821691505b6020821081036133ff576133fe6133a5565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061343b602083612d65565b915061344682613405565b602082019050919050565b6000602082019050818103600083015261346a8161342e565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026134d37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613496565b6134dd8683613496565b95508019841693508086168417925050509392505050565b6000819050919050565b600061351a61351561351084612e15565b6134f5565b612e15565b9050919050565b6000819050919050565b613534836134ff565b61354861354082613521565b8484546134a3565b825550505050565b600090565b61355d613550565b61356881848461352b565b505050565b5b8181101561358c57613581600082613555565b60018101905061356e565b5050565b601f8211156135d1576135a281613471565b6135ab84613486565b810160208510156135ba578190505b6135ce6135c685613486565b83018261356d565b50505b505050565b600082821c905092915050565b60006135f4600019846008026135d6565b1980831691505092915050565b600061360d83836135e3565b9150826002028217905092915050565b61362682612d5a565b67ffffffffffffffff81111561363f5761363e613020565b5b61364982546133d4565b613654828285613590565b600060209050601f8311600181146136875760008415613675578287015190505b61367f8582613601565b8655506136e7565b601f19841661369586613471565b60005b828110156136bd57848901518255600182019150602085019450602081019050613698565b868310156136da57848901516136d6601f8916826135e3565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061372982612e15565b915061373483612e15565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613769576137686136ef565b5b828201905092915050565b600081905092915050565b600061378a82612d5a565b6137948185613774565b93506137a4818560208601612d76565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006137e6600583613774565b91506137f1826137b0565b600582019050919050565b6000613808828561377f565b9150613814828461377f565b915061381f826137d9565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613887602683612d65565b91506138928261382b565b604082019050919050565b600060208201905081810360008301526138b68161387a565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006138f3601f83612d65565b91506138fe826138bd565b602082019050919050565b60006020820190508181036000830152613922816138e6565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b600061395f601d83612d65565b915061396a82613929565b602082019050919050565b6000602082019050818103600083015261398e81613952565b9050919050565b600081905092915050565b50565b60006139b0600083613995565b91506139bb826139a0565b600082019050919050565b60006139d1826139a3565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000613a37603a83612d65565b9150613a42826139db565b604082019050919050565b60006020820190508181036000830152613a6681613a2a565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613a9482613a6d565b613a9e8185613a78565b9350613aae818560208601612d76565b613ab781612da9565b840191505092915050565b6000608082019050613ad76000830187612eaa565b613ae46020830186612eaa565b613af16040830185612f40565b8181036060830152613b038184613a89565b905095945050505050565b600081519050613b1d81612ccb565b92915050565b600060208284031215613b3957613b38612c95565b5b6000613b4784828501613b0e565b91505092915050565b6000613b5b82612e15565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613b8d57613b8c6136ef565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613bd282612e15565b9150613bdd83612e15565b925082613bed57613bec613b98565b5b828204905092915050565b6000613c0382612e15565b9150613c0e83612e15565b925082821015613c2157613c206136ef565b5b828203905092915050565b6000613c3782612e15565b9150613c4283612e15565b925082613c5257613c51613b98565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea26469706673582212200759d5dfe4e042361f534db217053f8f04f86af47108b553bf0103b3ecde75b864736f6c634300080f0033
Deployed Bytecode
0x6080604052600436106101d85760003560e01c806368bb0f6b11610102578063b88d4fde11610095578063e985e9c511610064578063e985e9c51461069d578063f2fde38b146106da578063f8f5d75b14610703578063fe662d921461071a576101d8565b8063b88d4fde146105e1578063c4efd9d61461060a578063c87b56dd14610635578063e6798baa14610672576101d8565b80638da5cb5b116100d15780638da5cb5b1461053957806395d89b41146105645780639fac68cb1461058f578063a22cb465146105b8576101d8565b806368bb0f6b146104b257806370a08231146104bc578063715018a6146104f95780638143475a14610510576101d8565b806342842e0e1161017a57806358dc83611161014957806358dc8361146103e45780635abbc9cd1461040d5780635d561c03146104385780636352211e14610475576101d8565b806342842e0e146103285780634f558e791461035157806356dc4f971461038e57806357368dce146103b9576101d8565b8063095ea7b3116101b6578063095ea7b31461028257806318160ddd146102ab57806323b872dd146102d6578063364e5095146102ff576101d8565b806301ffc9a7146101dd57806306fdde031461021a578063081812fc14610245575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff9190612cf7565b610743565b6040516102119190612d3f565b60405180910390f35b34801561022657600080fd5b5061022f610825565b60405161023c9190612df3565b60405180910390f35b34801561025157600080fd5b5061026c60048036038101906102679190612e4b565b6108b7565b6040516102799190612eb9565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a49190612f00565b610933565b005b3480156102b757600080fd5b506102c0610a37565b6040516102cd9190612f4f565b60405180910390f35b3480156102e257600080fd5b506102fd60048036038101906102f89190612f6a565b610a4e565b005b34801561030b57600080fd5b5061032660048036038101906103219190612fe9565b610a5e565b005b34801561033457600080fd5b5061034f600480360381019061034a9190612f6a565b610af7565b005b34801561035d57600080fd5b5061037860048036038101906103739190612e4b565b610b17565b6040516103859190612d3f565b60405180910390f35b34801561039a57600080fd5b506103a3610b29565b6040516103b09190612f4f565b60405180910390f35b3480156103c557600080fd5b506103ce610b2f565b6040516103db9190612f4f565b60405180910390f35b3480156103f057600080fd5b5061040b6004803603810190610406919061314b565b610b35565b005b34801561041957600080fd5b50610422610bc4565b60405161042f9190612df3565b60405180910390f35b34801561044457600080fd5b5061045f600480360381019061045a9190613194565b610c52565b60405161046c9190612f4f565b60405180910390f35b34801561048157600080fd5b5061049c60048036038101906104979190612e4b565b610c6a565b6040516104a99190612eb9565b60405180910390f35b6104ba610c80565b005b3480156104c857600080fd5b506104e360048036038101906104de9190613194565b610d0e565b6040516104f09190612f4f565b60405180910390f35b34801561050557600080fd5b5061050e610ddd565b005b34801561051c57600080fd5b5061053760048036038101906105329190612f00565b610e65565b005b34801561054557600080fd5b5061054e610f16565b60405161055b9190612eb9565b60405180910390f35b34801561057057600080fd5b50610579610f40565b6040516105869190612df3565b60405180910390f35b34801561059b57600080fd5b506105b660048036038101906105b191906131c1565b610fd2565b005b3480156105c457600080fd5b506105df60048036038101906105da9190613201565b61105c565b005b3480156105ed57600080fd5b50610608600480360381019061060391906132e2565b6111d3565b005b34801561061657600080fd5b5061061f61124b565b60405161062c9190612d3f565b60405180910390f35b34801561064157600080fd5b5061065c60048036038101906106579190612e4b565b61125e565b6040516106699190612df3565b60405180910390f35b34801561067e57600080fd5b506106876112fc565b6040516106949190612f4f565b60405180910390f35b3480156106a957600080fd5b506106c460048036038101906106bf9190613365565b611302565b6040516106d19190612d3f565b60405180910390f35b3480156106e657600080fd5b5061070160048036038101906106fc9190613194565b611396565b005b34801561070f57600080fd5b5061071861148d565b005b34801561072657600080fd5b50610741600480360381019061073c9190612e4b565b61160f565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061080e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061081e575061081d82611695565b5b9050919050565b606060038054610834906133d4565b80601f0160208091040260200160405190810160405280929190818152602001828054610860906133d4565b80156108ad5780601f10610882576101008083540402835291602001916108ad565b820191906000526020600020905b81548152906001019060200180831161089057829003601f168201915b5050505050905090565b60006108c2826116ff565b6108f8576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061093e82610c6a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036109a5576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109c461174d565b73ffffffffffffffffffffffffffffffffffffffff1614610a27576109f0816109eb61174d565b611302565b610a26576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b610a32838383611755565b505050565b6000610a41611807565b6002546001540303905090565b610a59838383611810565b505050565b610a6661174d565b73ffffffffffffffffffffffffffffffffffffffff16610a84610f16565b73ffffffffffffffffffffffffffffffffffffffff1614610ada576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad190613451565b60405180910390fd5b80600c60006101000a81548160ff02191690831515021790555050565b610b12838383604051806020016040528060008152506111d3565b505050565b6000610b22826116ff565b9050919050565b600e5481565b600d5481565b610b3d61174d565b73ffffffffffffffffffffffffffffffffffffffff16610b5b610f16565b73ffffffffffffffffffffffffffffffffffffffff1614610bb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba890613451565b60405180910390fd5b80600b9081610bc0919061361d565b5050565b600b8054610bd1906133d4565b80601f0160208091040260200160405190810160405280929190818152602001828054610bfd906133d4565b8015610c4a5780601f10610c1f57610100808354040283529160200191610c4a565b820191906000526020600020905b815481529060010190602001808311610c2d57829003601f168201915b505050505081565b600f6020528060005260406000206000915090505481565b6000610c7582611cc4565b600001519050919050565b610c8861174d565b73ffffffffffffffffffffffffffffffffffffffff16610ca6610f16565b73ffffffffffffffffffffffffffffffffffffffff1614610cfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf390613451565b60405180910390fd5b6000479050610d0b3382611f4f565b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d75576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610de561174d565b73ffffffffffffffffffffffffffffffffffffffff16610e03610f16565b73ffffffffffffffffffffffffffffffffffffffff1614610e59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5090613451565b60405180910390fd5b610e636000612043565b565b610e6d61174d565b73ffffffffffffffffffffffffffffffffffffffff16610e8b610f16565b73ffffffffffffffffffffffffffffffffffffffff1614610ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed890613451565b60405180910390fd5b6000610eeb610a37565b9050600d548282610efc919061371e565b1115610f0757600080fd5b610f118383612109565b505050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610f4f906133d4565b80601f0160208091040260200160405190810160405280929190818152602001828054610f7b906133d4565b8015610fc85780601f10610f9d57610100808354040283529160200191610fc8565b820191906000526020600020905b815481529060010190602001808311610fab57829003601f168201915b5050505050905090565b610fda61174d565b73ffffffffffffffffffffffffffffffffffffffff16610ff8610f16565b73ffffffffffffffffffffffffffffffffffffffff161461104e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104590613451565b60405180910390fd5b6110588282612127565b5050565b61106461174d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110c8576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600860006110d561174d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661118261174d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111c79190612d3f565b60405180910390a35050565b6111de848484611810565b6111fd8373ffffffffffffffffffffffffffffffffffffffff16612516565b156112455761120e84848484612539565b611244576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600c60009054906101000a900460ff1681565b6060611269826116ff565b61129f576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006112a9612689565b905060008151036112c957604051806020016040528060008152506112f4565b806112d38461271b565b6040516020016112e49291906137fc565b6040516020818303038152906040525b915050919050565b60005481565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61139e61174d565b73ffffffffffffffffffffffffffffffffffffffff166113bc610f16565b73ffffffffffffffffffffffffffffffffffffffff1614611412576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140990613451565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611481576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114789061389d565b60405180910390fd5b61148a81612043565b50565b6002600a54036114d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c990613909565b60405180910390fd5b6002600a8190555060006114e4610a37565b9050600c60009054906101000a900460ff166114ff57600080fd5b600d54600e5482611510919061371e565b111561151b57600080fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461155357600080fd5b600e54600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106115a057600080fd5b6115ac33600e54612109565b600e54600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115fd919061371e565b92505081905550506001600a81905550565b61161761174d565b73ffffffffffffffffffffffffffffffffffffffff16611635610f16565b73ffffffffffffffffffffffffffffffffffffffff161461168b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168290613451565b60405180910390fd5b80600e8190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008161170a611807565b11158015611719575060015482105b8015611746575060056000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60008054905090565b600061181b82611cc4565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611886576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166118a761174d565b73ffffffffffffffffffffffffffffffffffffffff1614806118d657506118d5856118d061174d565b611302565b5b8061191b57506118e461174d565b73ffffffffffffffffffffffffffffffffffffffff16611903846108b7565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611954576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036119ba576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119c7858585600161287b565b6119d360008487611755565b6001600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611c52576001548214611c5157878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611cbd8585856001612881565b5050505050565b611ccc612c48565b600082905080611cda611807565b11611f1857600154811015611f17576000600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611f1557600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611df9578092505050611f4a565b5b600115611f1457818060019003925050600560008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611f0f578092505050611f4a565b611dfa565b5b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b80471015611f92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8990613975565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611fb8906139c6565b60006040518083038185875af1925050503d8060008114611ff5576040519150601f19603f3d011682016040523d82523d6000602084013e611ffa565b606091505b505090508061203e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203590613a4d565b60405180910390fd5b505050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612123828260405180602001604052806000815250612887565b5050565b600061213283611cc4565b905060008160000151905082156122135760008173ffffffffffffffffffffffffffffffffffffffff1661216461174d565b73ffffffffffffffffffffffffffffffffffffffff16148061219357506121928261218d61174d565b611302565b5b806121d857506121a161174d565b73ffffffffffffffffffffffffffffffffffffffff166121c0866108b7565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612211576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61222181600086600161287b565b61222d60008583611755565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060018160000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060018160000160108282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600560008781526020019081526020016000209050828160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600181600001601c6101000a81548160ff02191690831515021790555060006001870190506000600560008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361249057600154821461248f57848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b5050505083600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124fe816000866001612881565b60026000815480929190600101919050555050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261255f61174d565b8786866040518563ffffffff1660e01b81526004016125819493929190613ac2565b6020604051808303816000875af19250505080156125bd57506040513d601f19601f820116820180604052508101906125ba9190613b23565b60015b612636573d80600081146125ed576040519150601f19603f3d011682016040523d82523d6000602084013e6125f2565b606091505b50600081510361262e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600b8054612698906133d4565b80601f01602080910402602001604051908101604052809291908181526020018280546126c4906133d4565b80156127115780601f106126e657610100808354040283529160200191612711565b820191906000526020600020905b8154815290600101906020018083116126f457829003601f168201915b5050505050905090565b606060008203612762576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612876565b600082905060005b6000821461279457808061277d90613b50565b915050600a8261278d9190613bc7565b915061276a565b60008167ffffffffffffffff8111156127b0576127af613020565b5b6040519080825280601f01601f1916602001820160405280156127e25781602001600182028036833780820191505090505b5090505b6000851461286f576001826127fb9190613bf8565b9150600a8561280a9190613c2c565b6030612816919061371e565b60f81b81838151811061282c5761282b613c5d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128689190613bc7565b94506127e6565b8093505050505b919050565b50505050565b50505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036128f4576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000830361292e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61293b600085838661287b565b82600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836005600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426005600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008482019050612afc8673ffffffffffffffffffffffffffffffffffffffff16612516565b15612bc1575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612b716000878480600101955087612539565b612ba7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210612b02578260015414612bbc57600080fd5b612c2c565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612bc2575b816001819055505050612c426000858386612881565b50505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612cd481612c9f565b8114612cdf57600080fd5b50565b600081359050612cf181612ccb565b92915050565b600060208284031215612d0d57612d0c612c95565b5b6000612d1b84828501612ce2565b91505092915050565b60008115159050919050565b612d3981612d24565b82525050565b6000602082019050612d546000830184612d30565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612d94578082015181840152602081019050612d79565b83811115612da3576000848401525b50505050565b6000601f19601f8301169050919050565b6000612dc582612d5a565b612dcf8185612d65565b9350612ddf818560208601612d76565b612de881612da9565b840191505092915050565b60006020820190508181036000830152612e0d8184612dba565b905092915050565b6000819050919050565b612e2881612e15565b8114612e3357600080fd5b50565b600081359050612e4581612e1f565b92915050565b600060208284031215612e6157612e60612c95565b5b6000612e6f84828501612e36565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612ea382612e78565b9050919050565b612eb381612e98565b82525050565b6000602082019050612ece6000830184612eaa565b92915050565b612edd81612e98565b8114612ee857600080fd5b50565b600081359050612efa81612ed4565b92915050565b60008060408385031215612f1757612f16612c95565b5b6000612f2585828601612eeb565b9250506020612f3685828601612e36565b9150509250929050565b612f4981612e15565b82525050565b6000602082019050612f646000830184612f40565b92915050565b600080600060608486031215612f8357612f82612c95565b5b6000612f9186828701612eeb565b9350506020612fa286828701612eeb565b9250506040612fb386828701612e36565b9150509250925092565b612fc681612d24565b8114612fd157600080fd5b50565b600081359050612fe381612fbd565b92915050565b600060208284031215612fff57612ffe612c95565b5b600061300d84828501612fd4565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61305882612da9565b810181811067ffffffffffffffff8211171561307757613076613020565b5b80604052505050565b600061308a612c8b565b9050613096828261304f565b919050565b600067ffffffffffffffff8211156130b6576130b5613020565b5b6130bf82612da9565b9050602081019050919050565b82818337600083830152505050565b60006130ee6130e98461309b565b613080565b90508281526020810184848401111561310a5761310961301b565b5b6131158482856130cc565b509392505050565b600082601f83011261313257613131613016565b5b81356131428482602086016130db565b91505092915050565b60006020828403121561316157613160612c95565b5b600082013567ffffffffffffffff81111561317f5761317e612c9a565b5b61318b8482850161311d565b91505092915050565b6000602082840312156131aa576131a9612c95565b5b60006131b884828501612eeb565b91505092915050565b600080604083850312156131d8576131d7612c95565b5b60006131e685828601612e36565b92505060206131f785828601612fd4565b9150509250929050565b6000806040838503121561321857613217612c95565b5b600061322685828601612eeb565b925050602061323785828601612fd4565b9150509250929050565b600067ffffffffffffffff82111561325c5761325b613020565b5b61326582612da9565b9050602081019050919050565b600061328561328084613241565b613080565b9050828152602081018484840111156132a1576132a061301b565b5b6132ac8482856130cc565b509392505050565b600082601f8301126132c9576132c8613016565b5b81356132d9848260208601613272565b91505092915050565b600080600080608085870312156132fc576132fb612c95565b5b600061330a87828801612eeb565b945050602061331b87828801612eeb565b935050604061332c87828801612e36565b925050606085013567ffffffffffffffff81111561334d5761334c612c9a565b5b613359878288016132b4565b91505092959194509250565b6000806040838503121561337c5761337b612c95565b5b600061338a85828601612eeb565b925050602061339b85828601612eeb565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806133ec57607f821691505b6020821081036133ff576133fe6133a5565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061343b602083612d65565b915061344682613405565b602082019050919050565b6000602082019050818103600083015261346a8161342e565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026134d37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613496565b6134dd8683613496565b95508019841693508086168417925050509392505050565b6000819050919050565b600061351a61351561351084612e15565b6134f5565b612e15565b9050919050565b6000819050919050565b613534836134ff565b61354861354082613521565b8484546134a3565b825550505050565b600090565b61355d613550565b61356881848461352b565b505050565b5b8181101561358c57613581600082613555565b60018101905061356e565b5050565b601f8211156135d1576135a281613471565b6135ab84613486565b810160208510156135ba578190505b6135ce6135c685613486565b83018261356d565b50505b505050565b600082821c905092915050565b60006135f4600019846008026135d6565b1980831691505092915050565b600061360d83836135e3565b9150826002028217905092915050565b61362682612d5a565b67ffffffffffffffff81111561363f5761363e613020565b5b61364982546133d4565b613654828285613590565b600060209050601f8311600181146136875760008415613675578287015190505b61367f8582613601565b8655506136e7565b601f19841661369586613471565b60005b828110156136bd57848901518255600182019150602085019450602081019050613698565b868310156136da57848901516136d6601f8916826135e3565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061372982612e15565b915061373483612e15565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613769576137686136ef565b5b828201905092915050565b600081905092915050565b600061378a82612d5a565b6137948185613774565b93506137a4818560208601612d76565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b60006137e6600583613774565b91506137f1826137b0565b600582019050919050565b6000613808828561377f565b9150613814828461377f565b915061381f826137d9565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613887602683612d65565b91506138928261382b565b604082019050919050565b600060208201905081810360008301526138b68161387a565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006138f3601f83612d65565b91506138fe826138bd565b602082019050919050565b60006020820190508181036000830152613922816138e6565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b600061395f601d83612d65565b915061396a82613929565b602082019050919050565b6000602082019050818103600083015261398e81613952565b9050919050565b600081905092915050565b50565b60006139b0600083613995565b91506139bb826139a0565b600082019050919050565b60006139d1826139a3565b9150819050919050565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b6000613a37603a83612d65565b9150613a42826139db565b604082019050919050565b60006020820190508181036000830152613a6681613a2a565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613a9482613a6d565b613a9e8185613a78565b9350613aae818560208601612d76565b613ab781612da9565b840191505092915050565b6000608082019050613ad76000830187612eaa565b613ae46020830186612eaa565b613af16040830185612f40565b8181036060830152613b038184613a89565b905095945050505050565b600081519050613b1d81612ccb565b92915050565b600060208284031215613b3957613b38612c95565b5b6000613b4784828501613b0e565b91505092915050565b6000613b5b82612e15565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613b8d57613b8c6136ef565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613bd282612e15565b9150613bdd83612e15565b925082613bed57613bec613b98565b5b828204905092915050565b6000613c0382612e15565b9150613c0e83612e15565b925082821015613c2157613c206136ef565b5b828203905092915050565b6000613c3782612e15565b9150613c4283612e15565b925082613c5257613c51613b98565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea26469706673582212200759d5dfe4e042361f534db217053f8f04f86af47108b553bf0103b3ecde75b864736f6c634300080f0033
Deployed Bytecode Sourcemap
50826:1938:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29235:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32350:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33863:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33425:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28475:312;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34728:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51926:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34969:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52535:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51044:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51008:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52140:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50944:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51081:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32158:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52254:161;;;:::i;:::-;;29604:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5436:103;;;;;;;;;;;;;:::i;:::-;;51709:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4785:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32519:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52645:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34139:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35225:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50975:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32694:327;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;583:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34497:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5694:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51326:375;;;;;;;;;;;;;:::i;:::-;;52023:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29235:305;29337:4;29389:25;29374:40;;;:11;:40;;;;:105;;;;29446:33;29431:48;;;:11;:48;;;;29374:105;:158;;;;29496:36;29520:11;29496:23;:36::i;:::-;29374:158;29354:178;;29235:305;;;:::o;32350:100::-;32404:13;32437:5;32430:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32350:100;:::o;33863:204::-;33931:7;33956:16;33964:7;33956;:16::i;:::-;33951:64;;33981:34;;;;;;;;;;;;;;33951:64;34035:15;:24;34051:7;34035:24;;;;;;;;;;;;;;;;;;;;;34028:31;;33863:204;;;:::o;33425:372::-;33498:13;33514:24;33530:7;33514:15;:24::i;:::-;33498:40;;33559:5;33553:11;;:2;:11;;;33549:48;;33573:24;;;;;;;;;;;;;;33549:48;33630:5;33614:21;;:12;:10;:12::i;:::-;:21;;;33610:139;;33641:37;33658:5;33665:12;:10;:12::i;:::-;33641:16;:37::i;:::-;33637:112;;33702:35;;;;;;;;;;;;;;33637:112;33610:139;33761:28;33770:2;33774:7;33783:5;33761:8;:28::i;:::-;33487:310;33425:372;;:::o;28475:312::-;28528:7;28753:15;:13;:15::i;:::-;28738:12;;28722:13;;:28;:46;28715:53;;28475:312;:::o;34728:170::-;34862:28;34872:4;34878:2;34882:7;34862:9;:28::i;:::-;34728:170;;;:::o;51926:89::-;5016:12;:10;:12::i;:::-;5005:23;;:7;:5;:7::i;:::-;:23;;;4997:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52000:7:::1;51991:6;;:16;;;;;;;;;;;;;;;;;;51926:89:::0;:::o;34969:185::-;35107:39;35124:4;35130:2;35134:7;35107:39;;;;;;;;;;;;:16;:39::i;:::-;34969:185;;;:::o;52535:102::-;52589:4;52613:16;52621:7;52613;:16::i;:::-;52606:23;;52535:102;;;:::o;51044:30::-;;;;:::o;51008:29::-;;;;:::o;52140:106::-;5016:12;:10;:12::i;:::-;5005:23;;:7;:5;:7::i;:::-;:23;;;4997:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52229:9:::1;52218:8;:20;;;;;;:::i;:::-;;52140:106:::0;:::o;50944:22::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51081:46::-;;;;;;;;;;;;;;;;;:::o;32158:125::-;32222:7;32249:21;32262:7;32249:12;:21::i;:::-;:26;;;32242:33;;32158:125;;;:::o;52254:161::-;5016:12;:10;:12::i;:::-;5005:23;;:7;:5;:7::i;:::-;:23;;;4997:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52312:14:::1;52329:21;52312:38;;52361:46;52387:10;52400:6;52361:17;:46::i;:::-;52301:114;52254:161::o:0;29604:206::-;29668:7;29709:1;29692:19;;:5;:19;;;29688:60;;29720:28;;;;;;;;;;;;;;29688:60;29774:12;:19;29787:5;29774:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;29766:36;;29759:43;;29604:206;;;:::o;5436:103::-;5016:12;:10;:12::i;:::-;5005:23;;:7;:5;:7::i;:::-;:23;;;4997:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5501:30:::1;5528:1;5501:18;:30::i;:::-;5436:103::o:0;51709:209::-;5016:12;:10;:12::i;:::-;5005:23;;:7;:5;:7::i;:::-;:23;;;4997:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51791:19:::1;51813:13;:11;:13::i;:::-;51791:35;;51870:6;;51859:7;51845:11;:21;;;;:::i;:::-;:31;;51837:40;;;::::0;::::1;;51888:22;51898:2;51902:7;51888:9;:22::i;:::-;51780:138;51709:209:::0;;:::o;4785:87::-;4831:7;4858:6;;;;;;;;;;;4851:13;;4785:87;:::o;32519:104::-;32575:13;32608:7;32601:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32519:104;:::o;52645:116::-;5016:12;:10;:12::i;:::-;5005:23;;:7;:5;:7::i;:::-;:23;;;4997:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52724:29:::1;52730:7;52739:13;52724:5;:29::i;:::-;52645:116:::0;;:::o;34139:287::-;34250:12;:10;:12::i;:::-;34238:24;;:8;:24;;;34234:54;;34271:17;;;;;;;;;;;;;;34234:54;34346:8;34301:18;:32;34320:12;:10;:12::i;:::-;34301:32;;;;;;;;;;;;;;;:42;34334:8;34301:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;34399:8;34370:48;;34385:12;:10;:12::i;:::-;34370:48;;;34409:8;34370:48;;;;;;:::i;:::-;;;;;;;;34139:287;;:::o;35225:370::-;35392:28;35402:4;35408:2;35412:7;35392:9;:28::i;:::-;35435:15;:2;:13;;;:15::i;:::-;35431:157;;;35456:56;35487:4;35493:2;35497:7;35506:5;35456:30;:56::i;:::-;35452:136;;35536:40;;;;;;;;;;;;;;35452:136;35431:157;35225:370;;;;:::o;50975:26::-;;;;;;;;;;;;;:::o;32694:327::-;32767:13;32798:16;32806:7;32798;:16::i;:::-;32793:59;;32823:29;;;;;;;;;;;;;;32793:59;32865:21;32889:10;:8;:10::i;:::-;32865:34;;32942:1;32923:7;32917:21;:26;:96;;;;;;;;;;;;;;;;;32970:7;32979:18;:7;:16;:18::i;:::-;32953:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32917:96;32910:103;;;32694:327;;;:::o;583:27::-;;;;:::o;34497:164::-;34594:4;34618:18;:25;34637:5;34618:25;;;;;;;;;;;;;;;:35;34644:8;34618:35;;;;;;;;;;;;;;;;;;;;;;;;;34611:42;;34497:164;;;;:::o;5694:201::-;5016:12;:10;:12::i;:::-;5005:23;;:7;:5;:7::i;:::-;:23;;;4997:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5803:1:::1;5783:22;;:8;:22;;::::0;5775:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;5859:28;5878:8;5859:18;:28::i;:::-;5694:201:::0;:::o;51326:375::-;49803:1;50401:7;;:19;50393:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;49803:1;50534:7;:18;;;;51383:19:::1;51405:13;:11;:13::i;:::-;51383:35;;51437:6;;;;;;;;;;;51429:15;;;::::0;::::1;;51492:6;;51477:11;;51463;:25;;;;:::i;:::-;:35;;51455:44;;;::::0;::::1;;51532:9;51518:23;;:10;:23;;;51510:32;;;::::0;::::1;;51587:11;;51561;:23;51573:10;51561:23;;;;;;;;;;;;;;;;:37;51553:46;;;::::0;::::1;;51610:34;51620:10;51632:11;;51610:9;:34::i;:::-;51682:11;;51655;:23;51667:10;51655:23;;;;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;;;;;51372:329;49759:1:::0;50713:7;:22;;;;51326:375::o;52023:109::-;5016:12;:10;:12::i;:::-;5005:23;;:7;:5;:7::i;:::-;:23;;;4997:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52112:12:::1;52098:11;:26;;;;52023:109:::0;:::o;17592:157::-;17677:4;17716:25;17701:40;;;:11;:40;;;;17694:47;;17592:157;;;:::o;35850:174::-;35907:4;35950:7;35931:15;:13;:15::i;:::-;:26;;:53;;;;;35971:13;;35961:7;:23;35931:53;:85;;;;;35989:11;:20;36001:7;35989:20;;;;;;;;;;;:27;;;;;;;;;;;;35988:28;35931:85;35924:92;;35850:174;;;:::o;3509:98::-;3562:7;3589:10;3582:17;;3509:98;:::o;45072:196::-;45214:2;45187:15;:24;45203:7;45187:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;45252:7;45248:2;45232:28;;45241:5;45232:28;;;;;;;;;;;;45072:196;;;:::o;52423:104::-;52480:7;52507:12;;52500:19;;52423:104;:::o;40020:2130::-;40135:35;40173:21;40186:7;40173:12;:21::i;:::-;40135:59;;40233:4;40211:26;;:13;:18;;;:26;;;40207:67;;40246:28;;;;;;;;;;;;;;40207:67;40287:22;40329:4;40313:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;40350:36;40367:4;40373:12;:10;:12::i;:::-;40350:16;:36::i;:::-;40313:73;:126;;;;40427:12;:10;:12::i;:::-;40403:36;;:20;40415:7;40403:11;:20::i;:::-;:36;;;40313:126;40287:153;;40458:17;40453:66;;40484:35;;;;;;;;;;;;;;40453:66;40548:1;40534:16;;:2;:16;;;40530:52;;40559:23;;;;;;;;;;;;;;40530:52;40595:43;40617:4;40623:2;40627:7;40636:1;40595:21;:43::i;:::-;40703:35;40720:1;40724:7;40733:4;40703:8;:35::i;:::-;41064:1;41034:12;:18;41047:4;41034:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41108:1;41080:12;:16;41093:2;41080:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41126:31;41160:11;:20;41172:7;41160:20;;;;;;;;;;;41126:54;;41211:2;41195:8;:13;;;:18;;;;;;;;;;;;;;;;;;41261:15;41228:8;:23;;;:49;;;;;;;;;;;;;;;;;;41529:19;41561:1;41551:7;:11;41529:33;;41577:31;41611:11;:24;41623:11;41611:24;;;;;;;;;;;41577:58;;41679:1;41654:27;;:8;:13;;;;;;;;;;;;:27;;;41650:384;;41864:13;;41849:11;:28;41845:174;;41918:4;41902:8;:13;;;:20;;;;;;;;;;;;;;;;;;41971:13;:28;;;41945:8;:23;;;:54;;;;;;;;;;;;;;;;;;41845:174;41650:384;41009:1036;;;42081:7;42077:2;42062:27;;42071:4;42062:27;;;;;;;;;;;;42100:42;42121:4;42127:2;42131:7;42140:1;42100:20;:42::i;:::-;40124:2026;;40020:2130;;;:::o;30985:1111::-;31047:21;;:::i;:::-;31081:12;31096:7;31081:22;;31164:4;31145:15;:13;:15::i;:::-;:23;31141:888;;31181:13;;31174:4;:20;31170:859;;;31215:31;31249:11;:17;31261:4;31249:17;;;;;;;;;;;31215:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31290:9;:16;;;31285:729;;31361:1;31335:28;;:9;:14;;;:28;;;31331:101;;31399:9;31392:16;;;;;;31331:101;31734:261;31741:4;31734:261;;;31774:6;;;;;;;;31819:11;:17;31831:4;31819:17;;;;;;;;;;;31807:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31893:1;31867:28;;:9;:14;;;:28;;;31863:109;;31935:9;31928:16;;;;;;31863:109;31734:261;;;31285:729;31196:833;31170:859;31141:888;32057:31;;;;;;;;;;;;;;30985:1111;;;;:::o;8747:317::-;8862:6;8837:21;:31;;8829:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;8916:12;8934:9;:14;;8956:6;8934:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8915:52;;;8986:7;8978:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;8818:246;8747:317;;:::o;6055:191::-;6129:16;6148:6;;;;;;;;;;;6129:25;;6174:8;6165:6;;:17;;;;;;;;;;;;;;;;;;6229:8;6198:40;;6219:8;6198:40;;;;;;;;;;;;6118:128;6055:191;:::o;36108:104::-;36177:27;36187:2;36191:8;36177:27;;;;;;;;;;;;:9;:27::i;:::-;36108:104;;:::o;42546:2408::-;42626:35;42664:21;42677:7;42664:12;:21::i;:::-;42626:59;;42698:12;42713:13;:18;;;42698:33;;42748:13;42744:290;;;42778:22;42820:4;42804:20;;:12;:10;:12::i;:::-;:20;;;:77;;;;42845:36;42862:4;42868:12;:10;:12::i;:::-;42845:16;:36::i;:::-;42804:77;:134;;;;42926:12;:10;:12::i;:::-;42902:36;;:20;42914:7;42902:11;:20::i;:::-;:36;;;42804:134;42778:161;;42961:17;42956:66;;42987:35;;;;;;;;;;;;;;42956:66;42763:271;42744:290;43046:51;43068:4;43082:1;43086:7;43095:1;43046:21;:51::i;:::-;43162:35;43179:1;43183:7;43192:4;43162:8;:35::i;:::-;43493:31;43527:12;:18;43540:4;43527:18;;;;;;;;;;;;;;;43493:52;;43583:1;43560:11;:19;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43627:1;43599:11;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43727:31;43761:11;:20;43773:7;43761:20;;;;;;;;;;;43727:54;;43812:4;43796:8;:13;;;:20;;;;;;;;;;;;;;;;;;43864:15;43831:8;:23;;;:49;;;;;;;;;;;;;;;;;;43913:4;43895:8;:15;;;:22;;;;;;;;;;;;;;;;;;44165:19;44197:1;44187:7;:11;44165:33;;44213:31;44247:11;:24;44259:11;44247:24;;;;;;;;;;;44213:58;;44315:1;44290:27;;:8;:13;;;;;;;;;;;;:27;;;44286:384;;44500:13;;44485:11;:28;44481:174;;44554:4;44538:8;:13;;;:20;;;;;;;;;;;;;;;;;;44607:13;:28;;;44581:8;:23;;;:54;;;;;;;;;;;;;;;;;;44481:174;44286:384;43468:1213;;;;44725:7;44721:1;44698:35;;44707:4;44698:35;;;;;;;;;;;;44744:50;44765:4;44779:1;44783:7;44792:1;44744:20;:50::i;:::-;44921:12;;:14;;;;;;;;;;;;;42615:2339;;42546:2408;;:::o;7486:326::-;7546:4;7803:1;7781:7;:19;;;:23;7774:30;;7486:326;;;:::o;45760:667::-;45923:4;45960:2;45944:36;;;45981:12;:10;:12::i;:::-;45995:4;46001:7;46010:5;45944:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;45940:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46195:1;46178:6;:13;:18;46174:235;;46224:40;;;;;;;;;;;;;;46174:235;46367:6;46361:13;46352:6;46348:2;46344:15;46337:38;45940:480;46073:45;;;46063:55;;;:6;:55;;;;46056:62;;;45760:667;;;;;;:::o;51217:101::-;51269:13;51302:8;51295:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51217:101;:::o;1071:723::-;1127:13;1357:1;1348:5;:10;1344:53;;1375:10;;;;;;;;;;;;;;;;;;;;;1344:53;1407:12;1422:5;1407:20;;1438:14;1463:78;1478:1;1470:4;:9;1463:78;;1496:8;;;;;:::i;:::-;;;;1527:2;1519:10;;;;;:::i;:::-;;;1463:78;;;1551:19;1583:6;1573:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1551:39;;1601:154;1617:1;1608:5;:10;1601:154;;1645:1;1635:11;;;;;:::i;:::-;;;1712:2;1704:5;:10;;;;:::i;:::-;1691:2;:24;;;;:::i;:::-;1678:39;;1661:6;1668;1661:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1741:2;1732:11;;;;;:::i;:::-;;;1601:154;;;1779:6;1765:21;;;;;1071:723;;;;:::o;47075:159::-;;;;;:::o;47893:158::-;;;;;:::o;36585:1749::-;36708:20;36731:13;;36708:36;;36773:1;36759:16;;:2;:16;;;36755:48;;36784:19;;;;;;;;;;;;;;36755:48;36830:1;36818:8;:13;36814:44;;36840:18;;;;;;;;;;;;;;36814:44;36871:61;36901:1;36905:2;36909:12;36923:8;36871:21;:61::i;:::-;37244:8;37209:12;:16;37222:2;37209:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37308:8;37268:12;:16;37281:2;37268:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37367:2;37334:11;:25;37346:12;37334:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;37434:15;37384:11;:25;37396:12;37384:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;37467:20;37490:12;37467:35;;37517:11;37546:8;37531:12;:23;37517:37;;37575:15;:2;:13;;;:15::i;:::-;37571:631;;;37611:313;37667:12;37663:2;37642:38;;37659:1;37642:38;;;;;;;;;;;;37708:69;37747:1;37751:2;37755:14;;;;;;37771:5;37708:30;:69::i;:::-;37703:174;;37813:40;;;;;;;;;;;;;;37703:174;37919:3;37904:12;:18;37611:313;;38005:12;37988:13;;:29;37984:43;;38019:8;;;37984:43;37571:631;;;38068:119;38124:14;;;;;;38120:2;38099:40;;38116:1;38099:40;;;;;;;;;;;;38182:3;38167:12;:18;38068:119;;37571:631;38232:12;38216:13;:28;;;;37184:1072;;38266:60;38295:1;38299:2;38303:12;38317:8;38266:20;:60::i;:::-;36697:1637;36585:1749;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:116::-;5985:21;6000:5;5985:21;:::i;:::-;5978:5;5975:32;5965:60;;6021:1;6018;6011:12;5965:60;5915:116;:::o;6037:133::-;6080:5;6118:6;6105:20;6096:29;;6134:30;6158:5;6134:30;:::i;:::-;6037:133;;;;:::o;6176:323::-;6232:6;6281:2;6269:9;6260:7;6256:23;6252:32;6249:119;;;6287:79;;:::i;:::-;6249:119;6407:1;6432:50;6474:7;6465:6;6454:9;6450:22;6432:50;:::i;:::-;6422:60;;6378:114;6176:323;;;;:::o;6505:117::-;6614:1;6611;6604:12;6628:117;6737:1;6734;6727:12;6751:180;6799:77;6796:1;6789:88;6896:4;6893:1;6886:15;6920:4;6917:1;6910:15;6937:281;7020:27;7042:4;7020:27;:::i;:::-;7012:6;7008:40;7150:6;7138:10;7135:22;7114:18;7102:10;7099:34;7096:62;7093:88;;;7161:18;;:::i;:::-;7093:88;7201:10;7197:2;7190:22;6980:238;6937:281;;:::o;7224:129::-;7258:6;7285:20;;:::i;:::-;7275:30;;7314:33;7342:4;7334:6;7314:33;:::i;:::-;7224:129;;;:::o;7359:308::-;7421:4;7511:18;7503:6;7500:30;7497:56;;;7533:18;;:::i;:::-;7497:56;7571:29;7593:6;7571:29;:::i;:::-;7563:37;;7655:4;7649;7645:15;7637:23;;7359:308;;;:::o;7673:154::-;7757:6;7752:3;7747;7734:30;7819:1;7810:6;7805:3;7801:16;7794:27;7673:154;;;:::o;7833:412::-;7911:5;7936:66;7952:49;7994:6;7952:49;:::i;:::-;7936:66;:::i;:::-;7927:75;;8025:6;8018:5;8011:21;8063:4;8056:5;8052:16;8101:3;8092:6;8087:3;8083:16;8080:25;8077:112;;;8108:79;;:::i;:::-;8077:112;8198:41;8232:6;8227:3;8222;8198:41;:::i;:::-;7917:328;7833:412;;;;;:::o;8265:340::-;8321:5;8370:3;8363:4;8355:6;8351:17;8347:27;8337:122;;8378:79;;:::i;:::-;8337:122;8495:6;8482:20;8520:79;8595:3;8587:6;8580:4;8572:6;8568:17;8520:79;:::i;:::-;8511:88;;8327:278;8265:340;;;;:::o;8611:509::-;8680:6;8729:2;8717:9;8708:7;8704:23;8700:32;8697:119;;;8735:79;;:::i;:::-;8697:119;8883:1;8872:9;8868:17;8855:31;8913:18;8905:6;8902:30;8899:117;;;8935:79;;:::i;:::-;8899:117;9040:63;9095:7;9086:6;9075:9;9071:22;9040:63;:::i;:::-;9030:73;;8826:287;8611:509;;;;:::o;9126:329::-;9185:6;9234:2;9222:9;9213:7;9209:23;9205:32;9202:119;;;9240:79;;:::i;:::-;9202:119;9360:1;9385:53;9430:7;9421:6;9410:9;9406:22;9385:53;:::i;:::-;9375:63;;9331:117;9126:329;;;;:::o;9461:468::-;9526:6;9534;9583:2;9571:9;9562:7;9558:23;9554:32;9551:119;;;9589:79;;:::i;:::-;9551:119;9709:1;9734:53;9779:7;9770:6;9759:9;9755:22;9734:53;:::i;:::-;9724:63;;9680:117;9836:2;9862:50;9904:7;9895:6;9884:9;9880:22;9862:50;:::i;:::-;9852:60;;9807:115;9461:468;;;;;:::o;9935:::-;10000:6;10008;10057:2;10045:9;10036:7;10032:23;10028:32;10025:119;;;10063:79;;:::i;:::-;10025:119;10183:1;10208:53;10253:7;10244:6;10233:9;10229:22;10208:53;:::i;:::-;10198:63;;10154:117;10310:2;10336:50;10378:7;10369:6;10358:9;10354:22;10336:50;:::i;:::-;10326:60;;10281:115;9935:468;;;;;:::o;10409:307::-;10470:4;10560:18;10552:6;10549:30;10546:56;;;10582:18;;:::i;:::-;10546:56;10620:29;10642:6;10620:29;:::i;:::-;10612:37;;10704:4;10698;10694:15;10686:23;;10409:307;;;:::o;10722:410::-;10799:5;10824:65;10840:48;10881:6;10840:48;:::i;:::-;10824:65;:::i;:::-;10815:74;;10912:6;10905:5;10898:21;10950:4;10943:5;10939:16;10988:3;10979:6;10974:3;10970:16;10967:25;10964:112;;;10995:79;;:::i;:::-;10964:112;11085:41;11119:6;11114:3;11109;11085:41;:::i;:::-;10805:327;10722:410;;;;;:::o;11151:338::-;11206:5;11255:3;11248:4;11240:6;11236:17;11232:27;11222:122;;11263:79;;:::i;:::-;11222:122;11380:6;11367:20;11405:78;11479:3;11471:6;11464:4;11456:6;11452:17;11405:78;:::i;:::-;11396:87;;11212:277;11151:338;;;;:::o;11495:943::-;11590:6;11598;11606;11614;11663:3;11651:9;11642:7;11638:23;11634:33;11631:120;;;11670:79;;:::i;:::-;11631:120;11790:1;11815:53;11860:7;11851:6;11840:9;11836:22;11815:53;:::i;:::-;11805:63;;11761:117;11917:2;11943:53;11988:7;11979:6;11968:9;11964:22;11943:53;:::i;:::-;11933:63;;11888:118;12045:2;12071:53;12116:7;12107:6;12096:9;12092:22;12071:53;:::i;:::-;12061:63;;12016:118;12201:2;12190:9;12186:18;12173:32;12232:18;12224:6;12221:30;12218:117;;;12254:79;;:::i;:::-;12218:117;12359:62;12413:7;12404:6;12393:9;12389:22;12359:62;:::i;:::-;12349:72;;12144:287;11495:943;;;;;;;:::o;12444:474::-;12512:6;12520;12569:2;12557:9;12548:7;12544:23;12540:32;12537:119;;;12575:79;;:::i;:::-;12537:119;12695:1;12720:53;12765:7;12756:6;12745:9;12741:22;12720:53;:::i;:::-;12710:63;;12666:117;12822:2;12848:53;12893:7;12884:6;12873:9;12869:22;12848:53;:::i;:::-;12838:63;;12793:118;12444:474;;;;;:::o;12924:180::-;12972:77;12969:1;12962:88;13069:4;13066:1;13059:15;13093:4;13090:1;13083:15;13110:320;13154:6;13191:1;13185:4;13181:12;13171:22;;13238:1;13232:4;13228:12;13259:18;13249:81;;13315:4;13307:6;13303:17;13293:27;;13249:81;13377:2;13369:6;13366:14;13346:18;13343:38;13340:84;;13396:18;;:::i;:::-;13340:84;13161:269;13110:320;;;:::o;13436:182::-;13576:34;13572:1;13564:6;13560:14;13553:58;13436:182;:::o;13624:366::-;13766:3;13787:67;13851:2;13846:3;13787:67;:::i;:::-;13780:74;;13863:93;13952:3;13863:93;:::i;:::-;13981:2;13976:3;13972:12;13965:19;;13624:366;;;:::o;13996:419::-;14162:4;14200:2;14189:9;14185:18;14177:26;;14249:9;14243:4;14239:20;14235:1;14224:9;14220:17;14213:47;14277:131;14403:4;14277:131;:::i;:::-;14269:139;;13996:419;;;:::o;14421:141::-;14470:4;14493:3;14485:11;;14516:3;14513:1;14506:14;14550:4;14547:1;14537:18;14529:26;;14421:141;;;:::o;14568:93::-;14605:6;14652:2;14647;14640:5;14636:14;14632:23;14622:33;;14568:93;;;:::o;14667:107::-;14711:8;14761:5;14755:4;14751:16;14730:37;;14667:107;;;;:::o;14780:393::-;14849:6;14899:1;14887:10;14883:18;14922:97;14952:66;14941:9;14922:97;:::i;:::-;15040:39;15070:8;15059:9;15040:39;:::i;:::-;15028:51;;15112:4;15108:9;15101:5;15097:21;15088:30;;15161:4;15151:8;15147:19;15140:5;15137:30;15127:40;;14856:317;;14780:393;;;;;:::o;15179:60::-;15207:3;15228:5;15221:12;;15179:60;;;:::o;15245:142::-;15295:9;15328:53;15346:34;15355:24;15373:5;15355:24;:::i;:::-;15346:34;:::i;:::-;15328:53;:::i;:::-;15315:66;;15245:142;;;:::o;15393:75::-;15436:3;15457:5;15450:12;;15393:75;;;:::o;15474:269::-;15584:39;15615:7;15584:39;:::i;:::-;15645:91;15694:41;15718:16;15694:41;:::i;:::-;15686:6;15679:4;15673:11;15645:91;:::i;:::-;15639:4;15632:105;15550:193;15474:269;;;:::o;15749:73::-;15794:3;15749:73;:::o;15828:189::-;15905:32;;:::i;:::-;15946:65;16004:6;15996;15990:4;15946:65;:::i;:::-;15881:136;15828:189;;:::o;16023:186::-;16083:120;16100:3;16093:5;16090:14;16083:120;;;16154:39;16191:1;16184:5;16154:39;:::i;:::-;16127:1;16120:5;16116:13;16107:22;;16083:120;;;16023:186;;:::o;16215:543::-;16316:2;16311:3;16308:11;16305:446;;;16350:38;16382:5;16350:38;:::i;:::-;16434:29;16452:10;16434:29;:::i;:::-;16424:8;16420:44;16617:2;16605:10;16602:18;16599:49;;;16638:8;16623:23;;16599:49;16661:80;16717:22;16735:3;16717:22;:::i;:::-;16707:8;16703:37;16690:11;16661:80;:::i;:::-;16320:431;;16305:446;16215:543;;;:::o;16764:117::-;16818:8;16868:5;16862:4;16858:16;16837:37;;16764:117;;;;:::o;16887:169::-;16931:6;16964:51;17012:1;17008:6;17000:5;16997:1;16993:13;16964:51;:::i;:::-;16960:56;17045:4;17039;17035:15;17025:25;;16938:118;16887:169;;;;:::o;17061:295::-;17137:4;17283:29;17308:3;17302:4;17283:29;:::i;:::-;17275:37;;17345:3;17342:1;17338:11;17332:4;17329:21;17321:29;;17061:295;;;;:::o;17361:1395::-;17478:37;17511:3;17478:37;:::i;:::-;17580:18;17572:6;17569:30;17566:56;;;17602:18;;:::i;:::-;17566:56;17646:38;17678:4;17672:11;17646:38;:::i;:::-;17731:67;17791:6;17783;17777:4;17731:67;:::i;:::-;17825:1;17849:4;17836:17;;17881:2;17873:6;17870:14;17898:1;17893:618;;;;18555:1;18572:6;18569:77;;;18621:9;18616:3;18612:19;18606:26;18597:35;;18569:77;18672:67;18732:6;18725:5;18672:67;:::i;:::-;18666:4;18659:81;18528:222;17863:887;;17893:618;17945:4;17941:9;17933:6;17929:22;17979:37;18011:4;17979:37;:::i;:::-;18038:1;18052:208;18066:7;18063:1;18060:14;18052:208;;;18145:9;18140:3;18136:19;18130:26;18122:6;18115:42;18196:1;18188:6;18184:14;18174:24;;18243:2;18232:9;18228:18;18215:31;;18089:4;18086:1;18082:12;18077:17;;18052:208;;;18288:6;18279:7;18276:19;18273:179;;;18346:9;18341:3;18337:19;18331:26;18389:48;18431:4;18423:6;18419:17;18408:9;18389:48;:::i;:::-;18381:6;18374:64;18296:156;18273:179;18498:1;18494;18486:6;18482:14;18478:22;18472:4;18465:36;17900:611;;;17863:887;;17453:1303;;;17361:1395;;:::o;18762:180::-;18810:77;18807:1;18800:88;18907:4;18904:1;18897:15;18931:4;18928:1;18921:15;18948:305;18988:3;19007:20;19025:1;19007:20;:::i;:::-;19002:25;;19041:20;19059:1;19041:20;:::i;:::-;19036:25;;19195:1;19127:66;19123:74;19120:1;19117:81;19114:107;;;19201:18;;:::i;:::-;19114:107;19245:1;19242;19238:9;19231:16;;18948:305;;;;:::o;19259:148::-;19361:11;19398:3;19383:18;;19259:148;;;;:::o;19413:377::-;19519:3;19547:39;19580:5;19547:39;:::i;:::-;19602:89;19684:6;19679:3;19602:89;:::i;:::-;19595:96;;19700:52;19745:6;19740:3;19733:4;19726:5;19722:16;19700:52;:::i;:::-;19777:6;19772:3;19768:16;19761:23;;19523:267;19413:377;;;;:::o;19796:155::-;19936:7;19932:1;19924:6;19920:14;19913:31;19796:155;:::o;19957:400::-;20117:3;20138:84;20220:1;20215:3;20138:84;:::i;:::-;20131:91;;20231:93;20320:3;20231:93;:::i;:::-;20349:1;20344:3;20340:11;20333:18;;19957:400;;;:::o;20363:701::-;20644:3;20666:95;20757:3;20748:6;20666:95;:::i;:::-;20659:102;;20778:95;20869:3;20860:6;20778:95;:::i;:::-;20771:102;;20890:148;21034:3;20890:148;:::i;:::-;20883:155;;21055:3;21048:10;;20363:701;;;;;:::o;21070:225::-;21210:34;21206:1;21198:6;21194:14;21187:58;21279:8;21274:2;21266:6;21262:15;21255:33;21070:225;:::o;21301:366::-;21443:3;21464:67;21528:2;21523:3;21464:67;:::i;:::-;21457:74;;21540:93;21629:3;21540:93;:::i;:::-;21658:2;21653:3;21649:12;21642:19;;21301:366;;;:::o;21673:419::-;21839:4;21877:2;21866:9;21862:18;21854:26;;21926:9;21920:4;21916:20;21912:1;21901:9;21897:17;21890:47;21954:131;22080:4;21954:131;:::i;:::-;21946:139;;21673:419;;;:::o;22098:181::-;22238:33;22234:1;22226:6;22222:14;22215:57;22098:181;:::o;22285:366::-;22427:3;22448:67;22512:2;22507:3;22448:67;:::i;:::-;22441:74;;22524:93;22613:3;22524:93;:::i;:::-;22642:2;22637:3;22633:12;22626:19;;22285:366;;;:::o;22657:419::-;22823:4;22861:2;22850:9;22846:18;22838:26;;22910:9;22904:4;22900:20;22896:1;22885:9;22881:17;22874:47;22938:131;23064:4;22938:131;:::i;:::-;22930:139;;22657:419;;;:::o;23082:179::-;23222:31;23218:1;23210:6;23206:14;23199:55;23082:179;:::o;23267:366::-;23409:3;23430:67;23494:2;23489:3;23430:67;:::i;:::-;23423:74;;23506:93;23595:3;23506:93;:::i;:::-;23624:2;23619:3;23615:12;23608:19;;23267:366;;;:::o;23639:419::-;23805:4;23843:2;23832:9;23828:18;23820:26;;23892:9;23886:4;23882:20;23878:1;23867:9;23863:17;23856:47;23920:131;24046:4;23920:131;:::i;:::-;23912:139;;23639:419;;;:::o;24064:147::-;24165:11;24202:3;24187:18;;24064:147;;;;:::o;24217:114::-;;:::o;24337:398::-;24496:3;24517:83;24598:1;24593:3;24517:83;:::i;:::-;24510:90;;24609:93;24698:3;24609:93;:::i;:::-;24727:1;24722:3;24718:11;24711:18;;24337:398;;;:::o;24741:379::-;24925:3;24947:147;25090:3;24947:147;:::i;:::-;24940:154;;25111:3;25104:10;;24741:379;;;:::o;25126:245::-;25266:34;25262:1;25254:6;25250:14;25243:58;25335:28;25330:2;25322:6;25318:15;25311:53;25126:245;:::o;25377:366::-;25519:3;25540:67;25604:2;25599:3;25540:67;:::i;:::-;25533:74;;25616:93;25705:3;25616:93;:::i;:::-;25734:2;25729:3;25725:12;25718:19;;25377:366;;;:::o;25749:419::-;25915:4;25953:2;25942:9;25938:18;25930:26;;26002:9;25996:4;25992:20;25988:1;25977:9;25973:17;25966:47;26030:131;26156:4;26030:131;:::i;:::-;26022:139;;25749:419;;;:::o;26174:98::-;26225:6;26259:5;26253:12;26243:22;;26174:98;;;:::o;26278:168::-;26361:11;26395:6;26390:3;26383:19;26435:4;26430:3;26426:14;26411:29;;26278:168;;;;:::o;26452:360::-;26538:3;26566:38;26598:5;26566:38;:::i;:::-;26620:70;26683:6;26678:3;26620:70;:::i;:::-;26613:77;;26699:52;26744:6;26739:3;26732:4;26725:5;26721:16;26699:52;:::i;:::-;26776:29;26798:6;26776:29;:::i;:::-;26771:3;26767:39;26760:46;;26542:270;26452:360;;;;:::o;26818:640::-;27013:4;27051:3;27040:9;27036:19;27028:27;;27065:71;27133:1;27122:9;27118:17;27109:6;27065:71;:::i;:::-;27146:72;27214:2;27203:9;27199:18;27190:6;27146:72;:::i;:::-;27228;27296:2;27285:9;27281:18;27272:6;27228:72;:::i;:::-;27347:9;27341:4;27337:20;27332:2;27321:9;27317:18;27310:48;27375:76;27446:4;27437:6;27375:76;:::i;:::-;27367:84;;26818:640;;;;;;;:::o;27464:141::-;27520:5;27551:6;27545:13;27536:22;;27567:32;27593:5;27567:32;:::i;:::-;27464:141;;;;:::o;27611:349::-;27680:6;27729:2;27717:9;27708:7;27704:23;27700:32;27697:119;;;27735:79;;:::i;:::-;27697:119;27855:1;27880:63;27935:7;27926:6;27915:9;27911:22;27880:63;:::i;:::-;27870:73;;27826:127;27611:349;;;;:::o;27966:233::-;28005:3;28028:24;28046:5;28028:24;:::i;:::-;28019:33;;28074:66;28067:5;28064:77;28061:103;;28144:18;;:::i;:::-;28061:103;28191:1;28184:5;28180:13;28173:20;;27966:233;;;:::o;28205:180::-;28253:77;28250:1;28243:88;28350:4;28347:1;28340:15;28374:4;28371:1;28364:15;28391:185;28431:1;28448:20;28466:1;28448:20;:::i;:::-;28443:25;;28482:20;28500:1;28482:20;:::i;:::-;28477:25;;28521:1;28511:35;;28526:18;;:::i;:::-;28511:35;28568:1;28565;28561:9;28556:14;;28391:185;;;;:::o;28582:191::-;28622:4;28642:20;28660:1;28642:20;:::i;:::-;28637:25;;28676:20;28694:1;28676:20;:::i;:::-;28671:25;;28715:1;28712;28709:8;28706:34;;;28720:18;;:::i;:::-;28706:34;28765:1;28762;28758:9;28750:17;;28582:191;;;;:::o;28779:176::-;28811:1;28828:20;28846:1;28828:20;:::i;:::-;28823:25;;28862:20;28880:1;28862:20;:::i;:::-;28857:25;;28901:1;28891:35;;28906:18;;:::i;:::-;28891:35;28947:1;28944;28940:9;28935:14;;28779:176;;;;:::o;28961:180::-;29009:77;29006:1;28999:88;29106:4;29103:1;29096:15;29130:4;29127:1;29120:15
Swarm Source
ipfs://0759d5dfe4e042361f534db217053f8f04f86af47108b553bf0103b3ecde75b8
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.