ETH Price: $3,325.80 (-3.99%)

Token

Freeguys (FREE)
 

Overview

Max Total Supply

7,000 FREE

Holders

3,352

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
garr.eth
Balance
1 FREE
0x711281c1b26aaed86e40e4caaf76c1962b45e161
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Freeguys

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-22
*/

/**
 *Submitted for verification at Etherscan.io on 2022-01-16
*/

// SPDX-License-Identifier: MIT
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);
	}
}

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
	/**
	 * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
	 * by `operator` from `from`, this function is called.
	 *
	 * It must return its Solidity selector to confirm the token transfer.
	 * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
	 *
	 * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
	 */
	function onERC721Received(
		address operator,
		address from,
		uint256 tokenId,
		bytes calldata data
	) external returns (bytes4);
}

/**
 * @dev Collection of functions related to the address type
 */
library Address {
	/**
	 * @dev Returns true if `account` is a contract.
	 *
	 * [IMPORTANT]
	 * ====
	 * It is unsafe to assume that an address for which this function returns
	 * false is an externally-owned account (EOA) and not a contract.
	 *
	 * Among others, `isContract` will return false for the following
	 * types of addresses:
	 *
	 *  - an externally-owned account
	 *  - a contract in construction
	 *  - an address where a contract will be created
	 *  - an address where a contract lived, but was destroyed
	 * ====
	 */
	function isContract(address account) internal view returns (bool) {
		// This method relies on extcodesize, which returns 0 for contracts in
		// construction, since the code is only stored at the end of the
		// constructor execution.

		uint256 size;
		assembly {
			size := extcodesize(account)
		}
		return size > 0;
	}

	/**
	 * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
	 * `recipient`, forwarding all available gas and reverting on errors.
	 *
	 * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
	 * of certain opcodes, possibly making contracts go over the 2300 gas limit
	 * imposed by `transfer`, making them unable to receive funds via
	 * `transfer`. {sendValue} removes this limitation.
	 *
	 * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
	 *
	 * IMPORTANT: because control is transferred to `recipient`, care must be
	 * taken to not create reentrancy vulnerabilities. Consider using
	 * {ReentrancyGuard} or the
	 * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
	 */
	function sendValue(address payable recipient, uint256 amount) internal {
		require(address(this).balance >= amount, "Address: insufficient balance");

		(bool success, ) = recipient.call{value: amount}("");
		require(success, "Address: unable to send value, recipient may have reverted");
	}

	/**
	 * @dev Performs a Solidity function call using a low level `call`. A
	 * plain `call` is an unsafe replacement for a function call: use this
	 * function instead.
	 *
	 * If `target` reverts with a revert reason, it is bubbled up by this
	 * function (like regular Solidity function calls).
	 *
	 * Returns the raw returned data. To convert to the expected return value,
	 * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
	 *
	 * Requirements:
	 *
	 * - `target` must be a contract.
	 * - calling `target` with `data` must not revert.
	 *
	 * _Available since v3.1._
	 */
	function functionCall(address target, bytes memory data) internal returns (bytes memory) {
		return functionCall(target, data, "Address: low-level call failed");
	}

	/**
	 * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
	 * `errorMessage` as a fallback revert reason when `target` reverts.
	 *
	 * _Available since v3.1._
	 */
	function functionCall(
		address target,
		bytes memory data,
		string memory errorMessage
	) internal returns (bytes memory) {
		return functionCallWithValue(target, data, 0, errorMessage);
	}

	/**
	 * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
	 * but also transferring `value` wei to `target`.
	 *
	 * Requirements:
	 *
	 * - the calling contract must have an ETH balance of at least `value`.
	 * - the called Solidity function must be `payable`.
	 *
	 * _Available since v3.1._
	 */
	function functionCallWithValue(
		address target,
		bytes memory data,
		uint256 value
	) internal returns (bytes memory) {
		return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
	}

	/**
	 * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
	 * with `errorMessage` as a fallback revert reason when `target` reverts.
	 *
	 * _Available since v3.1._
	 */
	function functionCallWithValue(
		address target,
		bytes memory data,
		uint256 value,
		string memory errorMessage
	) internal returns (bytes memory) {
		require(address(this).balance >= value, "Address: insufficient balance for call");
		require(isContract(target), "Address: call to non-contract");

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

	/**
	 * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
	 * but performing a static call.
	 *
	 * _Available since v3.3._
	 */
	function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
		return functionStaticCall(target, data, "Address: low-level static call failed");
	}

	/**
	 * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
	 * but performing a static call.
	 *
	 * _Available since v3.3._
	 */
	function functionStaticCall(
		address target,
		bytes memory data,
		string memory errorMessage
	) internal view returns (bytes memory) {
		require(isContract(target), "Address: static call to non-contract");

		(bool success, bytes memory returndata) = target.staticcall(data);
		return verifyCallResult(success, returndata, errorMessage);
	}

	/**
	 * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
	 * but performing a delegate call.
	 *
	 * _Available since v3.4._
	 */
	function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
		return functionDelegateCall(target, data, "Address: low-level delegate call failed");
	}

	/**
	 * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
	 * but performing a delegate call.
	 *
	 * _Available since v3.4._
	 */
	function functionDelegateCall(
		address target,
		bytes memory data,
		string memory errorMessage
	) internal returns (bytes memory) {
		require(isContract(target), "Address: delegate call to non-contract");

		(bool success, bytes memory returndata) = target.delegatecall(data);
		return verifyCallResult(success, returndata, errorMessage);
	}

	/**
	 * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
	 * revert reason using the provided one.
	 *
	 * _Available since v4.3._
	 */
	function verifyCallResult(
		bool success,
		bytes memory returndata,
		string memory errorMessage
	) internal pure returns (bytes memory) {
		if (success) {
			return returndata;
		} else {
			// Look for revert reason and bubble it up if present
			if (returndata.length > 0) {
				// The easiest way to bubble the revert reason is using memory via assembly

				assembly {
					let returndata_size := mload(returndata)
					revert(add(32, returndata), returndata_size)
				}
			} else {
				revert(errorMessage);
			}
		}
	}
}

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

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


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

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


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
	/**
	 * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
	 */
	event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

	/**
	 * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
	 */
	event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

	/**
	 * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
	 */
	event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

	/**
	 * @dev Returns the number of tokens in ``owner``'s account.
	 */
	function balanceOf(address owner) external view returns (uint256 balance);

	/**
	 * @dev Returns the owner of the `tokenId` token.
	 *
	 * Requirements:
	 *
	 * - `tokenId` must exist.
	 */
	function ownerOf(uint256 tokenId) external view returns (address owner);

	/**
	 * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
	 * are aware of the ERC721 protocol to prevent tokens from being forever locked.
	 *
	 * Requirements:
	 *
	 * - `from` cannot be the zero address.
	 * - `to` cannot be the zero address.
	 * - `tokenId` token must exist and be owned by `from`.
	 * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
	 * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
	 *
	 * Emits a {Transfer} event.
	 */
	function safeTransferFrom(
		address from,
		address to,
		uint256 tokenId
	) external;

	/**
	 * @dev Transfers `tokenId` token from `from` to `to`.
	 *
	 * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
	 *
	 * Requirements:
	 *
	 * - `from` cannot be the zero address.
	 * - `to` cannot be the zero address.
	 * - `tokenId` token must be owned by `from`.
	 * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
	 *
	 * Emits a {Transfer} event.
	 */
	function transferFrom(
		address from,
		address to,
		uint256 tokenId
	) external;

	/**
	 * @dev Gives permission to `to` to transfer `tokenId` token to another account.
	 * The approval is cleared when the token is transferred.
	 *
	 * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
	 *
	 * Requirements:
	 *
	 * - The caller must own the token or be an approved operator.
	 * - `tokenId` must exist.
	 *
	 * Emits an {Approval} event.
	 */
	function approve(address to, uint256 tokenId) external;

	/**
	 * @dev Returns the account approved for `tokenId` token.
	 *
	 * Requirements:
	 *
	 * - `tokenId` must exist.
	 */
	function getApproved(uint256 tokenId) external view returns (address operator);

	/**
	 * @dev Approve or remove `operator` as an operator for the caller.
	 * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
	 *
	 * Requirements:
	 *
	 * - The `operator` cannot be the caller.
	 *
	 * Emits an {ApprovalForAll} event.
	 */
	function setApprovalForAll(address operator, bool _approved) external;

	/**
	 * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
	 *
	 * See {setApprovalForAll}
	 */
	function isApprovedForAll(address owner, address operator) external view returns (bool);

	/**
	 * @dev Safely transfers `tokenId` token from `from` to `to`.
	 *
	 * Requirements:
	 *
	 * - `from` cannot be the zero address.
	 * - `to` cannot be the zero address.
	 * - `tokenId` token must exist and be owned by `from`.
	 * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
	 * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
	 *
	 * Emits a {Transfer} event.
	 */
	function safeTransferFrom(
		address from,
		address to,
		uint256 tokenId,
		bytes calldata data
	) external;
}

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

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
	/**
	 * @dev Returns the total amount of tokens stored by the contract.
	 */
	function totalSupply() external view returns (uint256);

	/**
	 * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
	 * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
	 */
	function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

	/**
	 * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
	 * Use along with {totalSupply} to enumerate all tokens.
	 */
	function tokenByIndex(uint256 index) external view returns (uint256);
}


/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
	using Address for address;
	using Strings for uint256;

	// Token name
	string private _name;

	// Token symbol
	string private _symbol;

	// Mapping from token ID to owner address
	mapping(uint256 => address) private _owners;

	// Mapping owner address to token count
	mapping(address => uint256) private _balances;

	// Mapping from token ID to approved address
	mapping(uint256 => address) private _tokenApprovals;

	// Mapping from owner to operator approvals
	mapping(address => mapping(address => bool)) private _operatorApprovals;

	/**
	 * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
	 */
	constructor(string memory name_, string memory symbol_) {
		_name = name_;
		_symbol = symbol_;
	}

	/**
	 * @dev See {IERC165-supportsInterface}.
	 */
	function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
		return
			interfaceId == type(IERC721).interfaceId ||
			interfaceId == type(IERC721Metadata).interfaceId ||
			super.supportsInterface(interfaceId);
	}

	/**
	 * @dev See {IERC721-balanceOf}.
	 */
	function balanceOf(address owner) public view virtual override returns (uint256) {
		require(owner != address(0), "ERC721: balance query for the zero address");
		return _balances[owner];
	}

	/**
	 * @dev See {IERC721-ownerOf}.
	 */
	function ownerOf(uint256 tokenId) public view virtual override returns (address) {
		address owner = _owners[tokenId];
		require(owner != address(0), "ERC721: owner query for nonexistent token");
		return owner;
	}

	/**
	 * @dev See {IERC721Metadata-name}.
	 */
	function name() public view virtual override returns (string memory) {
		return _name;
	}

	/**
	 * @dev See {IERC721Metadata-symbol}.
	 */
	function symbol() public view virtual override returns (string memory) {
		return _symbol;
	}

	/**
	 * @dev See {IERC721Metadata-tokenURI}.
	 */
	function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
		require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

		string memory baseURI = _baseURI();
		return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
	}

	/**
	 * @dev Base URI for computing {tokenURI}. 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 virtual override {
		address owner = ERC721.ownerOf(tokenId);
		require(to != owner, "ERC721: approval to current owner");

		require(
			_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
			"ERC721: approve caller is not owner nor approved for all"
		);

		_approve(to, tokenId);
	}

	/**
	 * @dev See {IERC721-getApproved}.
	 */
	function getApproved(uint256 tokenId) public view virtual override returns (address) {
		require(_exists(tokenId), "ERC721: approved query for nonexistent token");

		return _tokenApprovals[tokenId];
	}

	/**
	 * @dev See {IERC721-setApprovalForAll}.
	 */
	function setApprovalForAll(address operator, bool approved) public virtual override {
		require(operator != _msgSender(), "ERC721: approve to caller");

		_operatorApprovals[_msgSender()][operator] = approved;
		emit ApprovalForAll(_msgSender(), operator, approved);
	}

	/**
	 * @dev See {IERC721-isApprovedForAll}.
	 */
	function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
		return _operatorApprovals[owner][operator];
	}

	/**
	 * @dev See {IERC721-transferFrom}.
	 */
	function transferFrom(
		address from,
		address to,
		uint256 tokenId
	) public virtual override {
		//solhint-disable-next-line max-line-length
		require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

		_transfer(from, to, tokenId);
	}

	/**
	 * @dev See {IERC721-safeTransferFrom}.
	 */
	function safeTransferFrom(
		address from,
		address to,
		uint256 tokenId
	) public virtual override {
		safeTransferFrom(from, to, tokenId, "");
	}

	/**
	 * @dev See {IERC721-safeTransferFrom}.
	 */
	function safeTransferFrom(
		address from,
		address to,
		uint256 tokenId,
		bytes memory _data
	) public virtual override {
		require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
		_safeTransfer(from, to, tokenId, _data);
	}

	/**
	 * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
	 * are aware of the ERC721 protocol to prevent tokens from being forever locked.
	 *
	 * `_data` is additional data, it has no specified format and it is sent in call to `to`.
	 *
	 * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
	 * implement alternative mechanisms to perform token transfer, such as signature-based.
	 *
	 * Requirements:
	 *
	 * - `from` cannot be the zero address.
	 * - `to` cannot be the zero address.
	 * - `tokenId` token must exist and be owned by `from`.
	 * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
	 *
	 * Emits a {Transfer} event.
	 */
	function _safeTransfer(
		address from,
		address to,
		uint256 tokenId,
		bytes memory _data
	) internal virtual {
		_transfer(from, to, tokenId);
		require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
	}

	/**
	 * @dev Returns whether `tokenId` exists.
	 *
	 * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
	 *
	 * Tokens start existing when they are minted (`_mint`),
	 * and stop existing when they are burned (`_burn`).
	 */
	function _exists(uint256 tokenId) internal view virtual returns (bool) {
		return _owners[tokenId] != address(0);
	}

	/**
	 * @dev Returns whether `spender` is allowed to manage `tokenId`.
	 *
	 * Requirements:
	 *
	 * - `tokenId` must exist.
	 */
	function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
		require(_exists(tokenId), "ERC721: operator query for nonexistent token");
		address owner = ERC721.ownerOf(tokenId);
		return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
	}

	/**
	 * @dev Safely mints `tokenId` and transfers it to `to`.
	 *
	 * Requirements:
	 *
	 * - `tokenId` must not exist.
	 * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
	 *
	 * Emits a {Transfer} event.
	 */
	function _safeMint(address to, uint256 tokenId) internal virtual {
		_safeMint(to, tokenId, "");
	}

	/**
	 * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
	 * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
	 */
	function _safeMint(
		address to,
		uint256 tokenId,
		bytes memory _data
	) internal virtual {
		_mint(to, tokenId);
		require(
			_checkOnERC721Received(address(0), to, tokenId, _data),
			"ERC721: transfer to non ERC721Receiver implementer"
		);
	}

	/**
	 * @dev Mints `tokenId` and transfers it to `to`.
	 *
	 * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
	 *
	 * Requirements:
	 *
	 * - `tokenId` must not exist.
	 * - `to` cannot be the zero address.
	 *
	 * Emits a {Transfer} event.
	 */
	function _mint(address to, uint256 tokenId) internal virtual {
		require(to != address(0), "ERC721: mint to the zero address");
		require(!_exists(tokenId), "ERC721: token already minted");

		_beforeTokenTransfer(address(0), to, tokenId);

		_balances[to] += 1;
		_owners[tokenId] = to;

		emit Transfer(address(0), to, tokenId);
	}

	/**
	 * @dev Destroys `tokenId`.
	 * The approval is cleared when the token is burned.
	 *
	 * Requirements:
	 *
	 * - `tokenId` must exist.
	 *
	 * Emits a {Transfer} event.
	 */
	function _burn(uint256 tokenId) internal virtual {
		address owner = ERC721.ownerOf(tokenId);

		_beforeTokenTransfer(owner, address(0), tokenId);

		// Clear approvals
		_approve(address(0), tokenId);

		_balances[owner] -= 1;
		delete _owners[tokenId];

		emit Transfer(owner, address(0), tokenId);
	}

	/**
	 * @dev Transfers `tokenId` from `from` to `to`.
	 *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
	 *
	 * Requirements:
	 *
	 * - `to` cannot be the zero address.
	 * - `tokenId` token must be owned by `from`.
	 *
	 * Emits a {Transfer} event.
	 */
	function _transfer(
		address from,
		address to,
		uint256 tokenId
	) internal virtual {
		require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
		require(to != address(0), "ERC721: transfer to the zero address");

		_beforeTokenTransfer(from, to, tokenId);

		// Clear approvals from the previous owner
		_approve(address(0), tokenId);

		_balances[from] -= 1;
		_balances[to] += 1;
		_owners[tokenId] = to;

		emit Transfer(from, to, tokenId);
	}

	/**
	 * @dev Approve `to` to operate on `tokenId`
	 *
	 * Emits a {Approval} event.
	 */
	function _approve(address to, uint256 tokenId) internal virtual {
		_tokenApprovals[tokenId] = to;
		emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
	}

	/**
	 * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
	 * The call is not executed if the target address is not a contract.
	 *
	 * @param from address representing the previous owner of the given token ID
	 * @param to target address that will receive the tokens
	 * @param tokenId uint256 ID of the token to be transferred
	 * @param _data bytes optional data to send along with the call
	 * @return bool whether the call correctly returned the expected magic value
	 */
	function _checkOnERC721Received(
		address from,
		address to,
		uint256 tokenId,
		bytes memory _data
	) private returns (bool) {
		if (to.isContract()) {
			try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
				return retval == IERC721Receiver.onERC721Received.selector;
			} catch (bytes memory reason) {
				if (reason.length == 0) {
					revert("ERC721: transfer to non ERC721Receiver implementer");
				} else {
					assembly {
						revert(add(32, reason), mload(reason))
					}
				}
			}
		} else {
			return true;
		}
	}

	/**
	 * @dev Hook that is called before any token transfer. This includes minting
	 * and burning.
	 *
	 * Calling conditions:
	 *
	 * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
	 * transferred to `to`.
	 * - When `from` is zero, `tokenId` will be minted for `to`.
	 * - When `to` is zero, ``from``'s `tokenId` will be burned.
	 * - `from` and `to` are never both zero.
	 *
	 * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
	 */
	function _beforeTokenTransfer(
		address from,
		address to,
		uint256 tokenId
	) internal virtual {}
}

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
	// Mapping from owner to list of owned token IDs
	mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

	// Mapping from token ID to index of the owner tokens list
	mapping(uint256 => uint256) private _ownedTokensIndex;

	// Array with all token ids, used for enumeration
	uint256[] private _allTokens;

	// Mapping from token id to position in the allTokens array
	mapping(uint256 => uint256) private _allTokensIndex;

	/**
	 * @dev See {IERC165-supportsInterface}.
	 */
	function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
		return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
	}

	/**
	 * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
	 */
	function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
		require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
		return _ownedTokens[owner][index];
	}

	/**
	 * @dev See {IERC721Enumerable-totalSupply}.
	 */
	function totalSupply() public view virtual override returns (uint256) {
		return _allTokens.length;
	}

	/**
	 * @dev See {IERC721Enumerable-tokenByIndex}.
	 */
	function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
		require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
		return _allTokens[index];
	}

	/**
	 * @dev Hook that is called before any token transfer. This includes minting
	 * and burning.
	 *
	 * Calling conditions:
	 *
	 * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
	 * transferred to `to`.
	 * - When `from` is zero, `tokenId` will be minted for `to`.
	 * - When `to` is zero, ``from``'s `tokenId` will be burned.
	 * - `from` cannot be the zero address.
	 * - `to` cannot be the zero address.
	 *
	 * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
	 */
	function _beforeTokenTransfer(
		address from,
		address to,
		uint256 tokenId
	) internal virtual override {
		super._beforeTokenTransfer(from, to, tokenId);

		if (from == address(0)) {
			_addTokenToAllTokensEnumeration(tokenId);
		} else if (from != to) {
			_removeTokenFromOwnerEnumeration(from, tokenId);
		}
		if (to == address(0)) {
			_removeTokenFromAllTokensEnumeration(tokenId);
		} else if (to != from) {
			_addTokenToOwnerEnumeration(to, tokenId);
		}
	}

	/**
	 * @dev Private function to add a token to this extension's ownership-tracking data structures.
	 * @param to address representing the new owner of the given token ID
	 * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
	 */
	function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
		uint256 length = ERC721.balanceOf(to);
		_ownedTokens[to][length] = tokenId;
		_ownedTokensIndex[tokenId] = length;
	}

	/**
	 * @dev Private function to add a token to this extension's token tracking data structures.
	 * @param tokenId uint256 ID of the token to be added to the tokens list
	 */
	function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
		_allTokensIndex[tokenId] = _allTokens.length;
		_allTokens.push(tokenId);
	}

	/**
	 * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
	 * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
	 * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
	 * This has O(1) time complexity, but alters the order of the _ownedTokens array.
	 * @param from address representing the previous owner of the given token ID
	 * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
	 */
	function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
		// To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
		// then delete the last slot (swap and pop).

		uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
		uint256 tokenIndex = _ownedTokensIndex[tokenId];

		// When the token to delete is the last token, the swap operation is unnecessary
		if (tokenIndex != lastTokenIndex) {
			uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

			_ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
			_ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
		}

		// This also deletes the contents at the last position of the array
		delete _ownedTokensIndex[tokenId];
		delete _ownedTokens[from][lastTokenIndex];
	}

	/**
	 * @dev Private function to remove a token from this extension's token tracking data structures.
	 * This has O(1) time complexity, but alters the order of the _allTokens array.
	 * @param tokenId uint256 ID of the token to be removed from the tokens list
	 */
	function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
		// To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
		// then delete the last slot (swap and pop).

		uint256 lastTokenIndex = _allTokens.length - 1;
		uint256 tokenIndex = _allTokensIndex[tokenId];

		// When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
		// rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
		// an 'if' statement (like in _removeTokenFromOwnerEnumeration)
		uint256 lastTokenId = _allTokens[lastTokenIndex];

		_allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
		_allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

		// This also deletes the contents at the last position of the array
		delete _allTokensIndex[tokenId];
		_allTokens.pop();
	}
}

contract Freeguys is ERC721Enumerable, Ownable {

	using Strings for uint256;

	string _baseTokenURI;
	uint256 private _reserved = 200;
	bool public _paused = true;
	bool public _wlPaused = true;
	string private _uri;

	mapping(address => bool) private _whitelistMinted;
	mapping(address => uint256) private _publicMinted;

	// withdraw address
	address t1;

	constructor(string memory baseURI) ERC721("Freeguys", "FREE")  {
		setBaseURI(baseURI);
		t1 = msg.sender;
	}

	function mintFreeguys(uint256 num) public {
		uint256 supply = totalSupply();
		address sender = msg.sender;
		require( !_paused, "Sale paused" );
		require( supply + num < 7001 - _reserved, "Exceeds maximum supply" );
		require( _publicMinted[sender] + num < 11, "Can only mint 10 per wallet" );

		for(uint256 i; i < num; i++){
			_safeMint(sender, supply + i);
		}
		_publicMinted[sender] += num;
	}

	function mintFreeguysWL(string memory id) public {
		uint256 supply = totalSupply();
		address sender = msg.sender;
		require( !_wlPaused, "Whitelist sold out" );
		require( supply + 1 < 2501 - _reserved, "Exceeds maximum whitelist supply" );
		require( keccak256(bytes(id)) == keccak256(bytes(_uri)), "Not whitelisted" );
		require( !_whitelistMinted[sender], "Already minted in whitelist");

		_safeMint(msg.sender, supply);
		_whitelistMinted[sender] = true;
	}

	function walletOfOwner(address _owner) public view returns(uint256[] memory) {
		uint256 tokenCount = balanceOf(_owner);

		uint256[] memory tokensId = new uint256[](tokenCount);
		for(uint256 i; i < tokenCount; i++){
			tokensId[i] = tokenOfOwnerByIndex(_owner, i);
		}
		return tokensId;
	}

	function _baseURI() internal view virtual override returns (string memory) {
		return _baseTokenURI;
	}

	function setBaseURI(string memory baseURI) public onlyOwner {
		_baseTokenURI = baseURI;
	}

	function whitelist(string memory addr) public onlyOwner {
		_uri = addr;
	}

	function giveAway(address _to, uint256 _amount) external onlyOwner {
		require( _amount <= _reserved, "Amount exceeds reserved amount for giveaways" );
		uint256 supply = totalSupply();
		for(uint256 i; i < _amount; i++){
			_safeMint( _to, supply + i );
		}
		_reserved -= _amount;
	}

	function pause(bool val) public onlyOwner {
		_paused = val;
	}

	function wlPause(bool val) public onlyOwner {
		_wlPaused = val;
	}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_wlPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"giveAway","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":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"mintFreeguys","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"id","type":"string"}],"name":"mintFreeguysWL","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"addr","type":"string"}],"name":"whitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"wlPause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260c8600c556001600d60006101000a81548160ff0219169083151502179055506001600d60016101000a81548160ff0219169083151502179055503480156200004c57600080fd5b506040516200494738038062004947833981810160405281019062000072919062000450565b6040518060400160405280600881526020017f46726565677579730000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f46524545000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000f69291906200032e565b5080600190805190602001906200010f9291906200032e565b50505062000132620001266200018b60201b60201c565b6200019360201b60201c565b62000143816200025960201b60201c565b33601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506200063b565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002696200018b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200028f6200030460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002e8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002df90620004d7565b60405180910390fd5b80600b9080519060200190620003009291906200032e565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200033c90620005a7565b90600052602060002090601f016020900481019282620003605760008555620003ac565b82601f106200037b57805160ff1916838001178555620003ac565b82800160010185558215620003ac579182015b82811115620003ab5782518255916020019190600101906200038e565b5b509050620003bb9190620003bf565b5090565b5b80821115620003da576000816000905550600101620003c0565b5090565b6000620003f5620003ef846200052d565b620004f9565b9050828152602081018484840111156200040e57600080fd5b6200041b84828562000571565b509392505050565b600082601f8301126200043557600080fd5b815162000447848260208601620003de565b91505092915050565b6000602082840312156200046357600080fd5b600082015167ffffffffffffffff8111156200047e57600080fd5b6200048c8482850162000423565b91505092915050565b6000620004a460208362000560565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006020820190508181036000830152620004f28162000495565b9050919050565b6000604051905081810181811067ffffffffffffffff821117156200052357620005226200060c565b5b8060405250919050565b600067ffffffffffffffff8211156200054b576200054a6200060c565b5b601f19601f8301169050602081019050919050565b600082825260208201905092915050565b60005b838110156200059157808201518184015260208101905062000574565b83811115620005a1576000848401525b50505050565b60006002820490506001821680620005c057607f821691505b60208210811415620005d757620005d6620005dd565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6142fc806200064b6000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c80634f6ccce711610104578063a22cb465116100a2578063ca80014411610071578063ca80014414610528578063e985e9c514610544578063f2fde38b14610574578063f9ce571814610590576101cf565b8063a22cb465146104a4578063b88d4fde146104c0578063c4ebdb7c146104dc578063c87b56dd146104f8576101cf565b806370a08231116100de57806370a082311461042e578063715018a61461045e5780638da5cb5b1461046857806395d89b4114610486576101cf565b80634f6ccce7146103b257806355f804b3146103e25780636352211e146103fe576101cf565b806316c61ccc1161017157806323b872dd1161014b57806323b872dd1461031a5780632f745c591461033657806342842e0e14610366578063438b630014610382576101cf565b806316c61ccc146102c257806318160ddd146102e05780632153ab0a146102fe576101cf565b806306fdde03116101ad57806306fdde031461023c578063081812fc1461025a578063095ea7b31461028a5780630d80bf64146102a6576101cf565b806301ffc9a7146101d457806302329a291461020457806304e8a66114610220575b600080fd5b6101ee60048036038101906101e99190612ead565b6105ae565b6040516101fb9190613abb565b60405180910390f35b61021e60048036038101906102199190612e84565b610628565b005b61023a60048036038101906102359190612f40565b6106c1565b005b61024461089a565b6040516102519190613ad6565b60405180910390f35b610274600480360381019061026f9190612f40565b61092c565b6040516102819190613a32565b60405180910390f35b6102a4600480360381019061029f9190612e48565b6109b1565b005b6102c060048036038101906102bb9190612eff565b610ac9565b005b6102ca610b5f565b6040516102d79190613abb565b60405180910390f35b6102e8610b72565b6040516102f59190613e38565b60405180910390f35b61031860048036038101906103139190612eff565b610b7f565b005b610334600480360381019061032f9190612d42565b610d90565b005b610350600480360381019061034b9190612e48565b610df0565b60405161035d9190613e38565b60405180910390f35b610380600480360381019061037b9190612d42565b610e95565b005b61039c60048036038101906103979190612cdd565b610eb5565b6040516103a99190613a99565b60405180910390f35b6103cc60048036038101906103c79190612f40565b610faf565b6040516103d99190613e38565b60405180910390f35b6103fc60048036038101906103f79190612eff565b611046565b005b61041860048036038101906104139190612f40565b6110dc565b6040516104259190613a32565b60405180910390f35b61044860048036038101906104439190612cdd565b61118e565b6040516104559190613e38565b60405180910390f35b610466611246565b005b6104706112ce565b60405161047d9190613a32565b60405180910390f35b61048e6112f8565b60405161049b9190613ad6565b60405180910390f35b6104be60048036038101906104b99190612e0c565b61138a565b005b6104da60048036038101906104d59190612d91565b61150b565b005b6104f660048036038101906104f19190612e84565b61156d565b005b610512600480360381019061050d9190612f40565b611606565b60405161051f9190613ad6565b60405180910390f35b610542600480360381019061053d9190612e48565b6116ad565b005b61055e60048036038101906105599190612d06565b6117cc565b60405161056b9190613abb565b60405180910390f35b61058e60048036038101906105899190612cdd565b611860565b005b610598611958565b6040516105a59190613abb565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061062157506106208261196b565b5b9050919050565b610630611a4d565b73ffffffffffffffffffffffffffffffffffffffff1661064e6112ce565b73ffffffffffffffffffffffffffffffffffffffff16146106a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069b90613d38565b60405180910390fd5b80600d60006101000a81548160ff02191690831515021790555050565b60006106cb610b72565b90506000339050600d60009054906101000a900460ff1615610722576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071990613af8565b60405180910390fd5b600c54611b596107329190614007565b838361073e9190613f80565b1061077e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077590613dd8565b60405180910390fd5b600b83601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546107cb9190613f80565b1061080b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080290613db8565b60405180910390fd5b60005b8381101561083e5761082b8282856108269190613f80565b611a55565b808061083690614123565b91505061080e565b5082601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461088e9190613f80565b92505081905550505050565b6060600080546108a9906140f1565b80601f01602080910402602001604051908101604052809291908181526020018280546108d5906140f1565b80156109225780601f106108f757610100808354040283529160200191610922565b820191906000526020600020905b81548152906001019060200180831161090557829003601f168201915b5050505050905090565b600061093782611a73565b610976576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096d90613d18565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109bc826110dc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2490613d98565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a4c611a4d565b73ffffffffffffffffffffffffffffffffffffffff161480610a7b5750610a7a81610a75611a4d565b6117cc565b5b610aba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab190613c38565b60405180910390fd5b610ac48383611adf565b505050565b610ad1611a4d565b73ffffffffffffffffffffffffffffffffffffffff16610aef6112ce565b73ffffffffffffffffffffffffffffffffffffffff1614610b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3c90613d38565b60405180910390fd5b80600e9080519060200190610b5b929190612b01565b5050565b600d60009054906101000a900460ff1681565b6000600880549050905090565b6000610b89610b72565b90506000339050600d60019054906101000a900460ff1615610be0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd790613b98565b60405180910390fd5b600c546109c5610bf09190614007565b600183610bfd9190613f80565b10610c3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3490613c18565b60405180910390fd5b600e604051610c4c91906139f7565b6040518091039020838051906020012014610c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9390613c58565b60405180910390fd5b600f60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610d29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2090613cb8565b60405180910390fd5b610d333383611a55565b6001600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550505050565b610da1610d9b611a4d565b82611b98565b610de0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd790613df8565b60405180910390fd5b610deb838383611c76565b505050565b6000610dfb8361118e565b8210610e3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3390613b18565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610eb08383836040518060200160405280600081525061150b565b505050565b60606000610ec28361118e565b905060008167ffffffffffffffff811115610f06577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610f345781602001602082028036833780820191505090505b50905060005b82811015610fa457610f4c8582610df0565b828281518110610f85577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080610f9c90614123565b915050610f3a565b508092505050919050565b6000610fb9610b72565b8210610ffa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff190613e18565b60405180910390fd5b60088281548110611034577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b61104e611a4d565b73ffffffffffffffffffffffffffffffffffffffff1661106c6112ce565b73ffffffffffffffffffffffffffffffffffffffff16146110c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b990613d38565b60405180910390fd5b80600b90805190602001906110d8929190612b01565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611185576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117c90613c98565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f690613c78565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61124e611a4d565b73ffffffffffffffffffffffffffffffffffffffff1661126c6112ce565b73ffffffffffffffffffffffffffffffffffffffff16146112c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b990613d38565b60405180910390fd5b6112cc6000611ed2565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611307906140f1565b80601f0160208091040260200160405190810160405280929190818152602001828054611333906140f1565b80156113805780601f1061135557610100808354040283529160200191611380565b820191906000526020600020905b81548152906001019060200180831161136357829003601f168201915b5050505050905090565b611392611a4d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611400576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f790613bd8565b60405180910390fd5b806005600061140d611a4d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114ba611a4d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114ff9190613abb565b60405180910390a35050565b61151c611516611a4d565b83611b98565b61155b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155290613df8565b60405180910390fd5b61156784848484611f98565b50505050565b611575611a4d565b73ffffffffffffffffffffffffffffffffffffffff166115936112ce565b73ffffffffffffffffffffffffffffffffffffffff16146115e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e090613d38565b60405180910390fd5b80600d60016101000a81548160ff02191690831515021790555050565b606061161182611a73565b611650576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164790613d78565b60405180910390fd5b600061165a611ff4565b9050600081511161167a57604051806020016040528060008152506116a5565b8061168484612086565b604051602001611695929190613a0e565b6040516020818303038152906040525b915050919050565b6116b5611a4d565b73ffffffffffffffffffffffffffffffffffffffff166116d36112ce565b73ffffffffffffffffffffffffffffffffffffffff1614611729576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172090613d38565b60405180910390fd5b600c5481111561176e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176590613cd8565b60405180910390fd5b6000611778610b72565b905060005b828110156117ad5761179a8482846117959190613f80565b611a55565b80806117a590614123565b91505061177d565b5081600c60008282546117c09190614007565b92505081905550505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611868611a4d565b73ffffffffffffffffffffffffffffffffffffffff166118866112ce565b73ffffffffffffffffffffffffffffffffffffffff16146118dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d390613d38565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561194c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194390613b58565b60405180910390fd5b61195581611ed2565b50565b600d60019054906101000a900460ff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611a3657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611a465750611a4582612233565b5b9050919050565b600033905090565b611a6f82826040518060200160405280600081525061229d565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611b52836110dc565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611ba382611a73565b611be2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd990613bf8565b60405180910390fd5b6000611bed836110dc565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c5c57508373ffffffffffffffffffffffffffffffffffffffff16611c448461092c565b73ffffffffffffffffffffffffffffffffffffffff16145b80611c6d5750611c6c81856117cc565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611c96826110dc565b73ffffffffffffffffffffffffffffffffffffffff1614611cec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce390613d58565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5390613bb8565b60405180910390fd5b611d678383836122f8565b611d72600082611adf565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dc29190614007565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e199190613f80565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611fa3848484611c76565b611faf8484848461240c565b611fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe590613b38565b60405180910390fd5b50505050565b6060600b8054612003906140f1565b80601f016020809104026020016040519081016040528092919081815260200182805461202f906140f1565b801561207c5780601f106120515761010080835404028352916020019161207c565b820191906000526020600020905b81548152906001019060200180831161205f57829003601f168201915b5050505050905090565b606060008214156120ce576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061222e565b600082905060005b600082146121005780806120e990614123565b915050600a826120f99190613fd6565b91506120d6565b60008167ffffffffffffffff811115612142577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156121745781602001600182028036833780820191505090505b5090505b600085146122275760018261218d9190614007565b9150600a8561219c919061416c565b60306121a89190613f80565b60f81b8183815181106121e4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856122209190613fd6565b9450612178565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6122a783836125a3565b6122b4600084848461240c565b6122f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ea90613b38565b60405180910390fd5b505050565b612303838383612771565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156123465761234181612776565b612385565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146123845761238383826127bf565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123c8576123c38161292c565b612407565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612406576124058282612a6f565b5b5b505050565b600061242d8473ffffffffffffffffffffffffffffffffffffffff16612aee565b15612596578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612456611a4d565b8786866040518563ffffffff1660e01b81526004016124789493929190613a4d565b602060405180830381600087803b15801561249257600080fd5b505af19250505080156124c357506040513d601f19601f820116820180604052508101906124c09190612ed6565b60015b612546573d80600081146124f3576040519150601f19603f3d011682016040523d82523d6000602084013e6124f8565b606091505b5060008151141561253e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253590613b38565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061259b565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612613576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260a90613cf8565b60405180910390fd5b61261c81611a73565b1561265c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265390613b78565b60405180910390fd5b612668600083836122f8565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126b89190613f80565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016127cc8461118e565b6127d69190614007565b90506000600760008481526020019081526020016000205490508181146128bb576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506129409190614007565b9050600060096000848152602001908152602001600020549050600060088381548110612996577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106129de577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612a53577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612a7a8361118e565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054612b0d906140f1565b90600052602060002090601f016020900481019282612b2f5760008555612b76565b82601f10612b4857805160ff1916838001178555612b76565b82800160010185558215612b76579182015b82811115612b75578251825591602001919060010190612b5a565b5b509050612b839190612b87565b5090565b5b80821115612ba0576000816000905550600101612b88565b5090565b6000612bb7612bb284613e84565b613e53565b905082815260208101848484011115612bcf57600080fd5b612bda8482856140af565b509392505050565b6000612bf5612bf084613eb4565b613e53565b905082815260208101848484011115612c0d57600080fd5b612c188482856140af565b509392505050565b600081359050612c2f8161426a565b92915050565b600081359050612c4481614281565b92915050565b600081359050612c5981614298565b92915050565b600081519050612c6e81614298565b92915050565b600082601f830112612c8557600080fd5b8135612c95848260208601612ba4565b91505092915050565b600082601f830112612caf57600080fd5b8135612cbf848260208601612be2565b91505092915050565b600081359050612cd7816142af565b92915050565b600060208284031215612cef57600080fd5b6000612cfd84828501612c20565b91505092915050565b60008060408385031215612d1957600080fd5b6000612d2785828601612c20565b9250506020612d3885828601612c20565b9150509250929050565b600080600060608486031215612d5757600080fd5b6000612d6586828701612c20565b9350506020612d7686828701612c20565b9250506040612d8786828701612cc8565b9150509250925092565b60008060008060808587031215612da757600080fd5b6000612db587828801612c20565b9450506020612dc687828801612c20565b9350506040612dd787828801612cc8565b925050606085013567ffffffffffffffff811115612df457600080fd5b612e0087828801612c74565b91505092959194509250565b60008060408385031215612e1f57600080fd5b6000612e2d85828601612c20565b9250506020612e3e85828601612c35565b9150509250929050565b60008060408385031215612e5b57600080fd5b6000612e6985828601612c20565b9250506020612e7a85828601612cc8565b9150509250929050565b600060208284031215612e9657600080fd5b6000612ea484828501612c35565b91505092915050565b600060208284031215612ebf57600080fd5b6000612ecd84828501612c4a565b91505092915050565b600060208284031215612ee857600080fd5b6000612ef684828501612c5f565b91505092915050565b600060208284031215612f1157600080fd5b600082013567ffffffffffffffff811115612f2b57600080fd5b612f3784828501612c9e565b91505092915050565b600060208284031215612f5257600080fd5b6000612f6084828501612cc8565b91505092915050565b6000612f7583836139d9565b60208301905092915050565b612f8a8161403b565b82525050565b6000612f9b82613f09565b612fa58185613f37565b9350612fb083613ee4565b8060005b83811015612fe1578151612fc88882612f69565b9750612fd383613f2a565b925050600181019050612fb4565b5085935050505092915050565b612ff78161404d565b82525050565b600061300882613f14565b6130128185613f48565b93506130228185602086016140be565b61302b81614259565b840191505092915050565b60008154613043816140f1565b61304d8186613f59565b945060018216600081146130685760018114613079576130ac565b60ff198316865281860193506130ac565b61308285613ef4565b60005b838110156130a457815481890152600182019150602081019050613085565b838801955050505b50505092915050565b60006130c082613f1f565b6130ca8185613f64565b93506130da8185602086016140be565b6130e381614259565b840191505092915050565b60006130f982613f1f565b6131038185613f75565b93506131138185602086016140be565b80840191505092915050565b600061312c600b83613f64565b91507f53616c65207061757365640000000000000000000000000000000000000000006000830152602082019050919050565b600061316c602b83613f64565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006131d2603283613f64565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613238602683613f64565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061329e601c83613f64565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006132de601283613f64565b91507f57686974656c69737420736f6c64206f757400000000000000000000000000006000830152602082019050919050565b600061331e602483613f64565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613384601983613f64565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006133c4602c83613f64565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061342a602083613f64565b91507f45786365656473206d6178696d756d2077686974656c69737420737570706c796000830152602082019050919050565b600061346a603883613f64565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006134d0600f83613f64565b91507f4e6f742077686974656c697374656400000000000000000000000000000000006000830152602082019050919050565b6000613510602a83613f64565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613576602983613f64565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006135dc601b83613f64565b91507f416c7265616479206d696e74656420696e2077686974656c69737400000000006000830152602082019050919050565b600061361c602c83613f64565b91507f416d6f756e74206578636565647320726573657276656420616d6f756e74206660008301527f6f722067697665617761797300000000000000000000000000000000000000006020830152604082019050919050565b6000613682602083613f64565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006136c2602c83613f64565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613728602083613f64565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613768602983613f64565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006137ce602f83613f64565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613834602183613f64565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061389a601b83613f64565b91507f43616e206f6e6c79206d696e74203130207065722077616c6c657400000000006000830152602082019050919050565b60006138da601683613f64565b91507f45786365656473206d6178696d756d20737570706c79000000000000000000006000830152602082019050919050565b600061391a603183613f64565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613980602c83613f64565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6139e2816140a5565b82525050565b6139f1816140a5565b82525050565b6000613a038284613036565b915081905092915050565b6000613a1a82856130ee565b9150613a2682846130ee565b91508190509392505050565b6000602082019050613a476000830184612f81565b92915050565b6000608082019050613a626000830187612f81565b613a6f6020830186612f81565b613a7c60408301856139e8565b8181036060830152613a8e8184612ffd565b905095945050505050565b60006020820190508181036000830152613ab38184612f90565b905092915050565b6000602082019050613ad06000830184612fee565b92915050565b60006020820190508181036000830152613af081846130b5565b905092915050565b60006020820190508181036000830152613b118161311f565b9050919050565b60006020820190508181036000830152613b318161315f565b9050919050565b60006020820190508181036000830152613b51816131c5565b9050919050565b60006020820190508181036000830152613b718161322b565b9050919050565b60006020820190508181036000830152613b9181613291565b9050919050565b60006020820190508181036000830152613bb1816132d1565b9050919050565b60006020820190508181036000830152613bd181613311565b9050919050565b60006020820190508181036000830152613bf181613377565b9050919050565b60006020820190508181036000830152613c11816133b7565b9050919050565b60006020820190508181036000830152613c318161341d565b9050919050565b60006020820190508181036000830152613c518161345d565b9050919050565b60006020820190508181036000830152613c71816134c3565b9050919050565b60006020820190508181036000830152613c9181613503565b9050919050565b60006020820190508181036000830152613cb181613569565b9050919050565b60006020820190508181036000830152613cd1816135cf565b9050919050565b60006020820190508181036000830152613cf18161360f565b9050919050565b60006020820190508181036000830152613d1181613675565b9050919050565b60006020820190508181036000830152613d31816136b5565b9050919050565b60006020820190508181036000830152613d518161371b565b9050919050565b60006020820190508181036000830152613d718161375b565b9050919050565b60006020820190508181036000830152613d91816137c1565b9050919050565b60006020820190508181036000830152613db181613827565b9050919050565b60006020820190508181036000830152613dd18161388d565b9050919050565b60006020820190508181036000830152613df1816138cd565b9050919050565b60006020820190508181036000830152613e118161390d565b9050919050565b60006020820190508181036000830152613e3181613973565b9050919050565b6000602082019050613e4d60008301846139e8565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613e7a57613e7961422a565b5b8060405250919050565b600067ffffffffffffffff821115613e9f57613e9e61422a565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613ecf57613ece61422a565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613f8b826140a5565b9150613f96836140a5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613fcb57613fca61419d565b5b828201905092915050565b6000613fe1826140a5565b9150613fec836140a5565b925082613ffc57613ffb6141cc565b5b828204905092915050565b6000614012826140a5565b915061401d836140a5565b9250828210156140305761402f61419d565b5b828203905092915050565b600061404682614085565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156140dc5780820151818401526020810190506140c1565b838111156140eb576000848401525b50505050565b6000600282049050600182168061410957607f821691505b6020821081141561411d5761411c6141fb565b5b50919050565b600061412e826140a5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156141615761416061419d565b5b600182019050919050565b6000614177826140a5565b9150614182836140a5565b925082614192576141916141cc565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6142738161403b565b811461427e57600080fd5b50565b61428a8161404d565b811461429557600080fd5b50565b6142a181614059565b81146142ac57600080fd5b50565b6142b8816140a5565b81146142c357600080fd5b5056fea26469706673582212202aafb7e351a32ebaa8678e6888a8c6d5760d5d7f3eb010d68cbace937602b0bc64736f6c6343000800003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c80634f6ccce711610104578063a22cb465116100a2578063ca80014411610071578063ca80014414610528578063e985e9c514610544578063f2fde38b14610574578063f9ce571814610590576101cf565b8063a22cb465146104a4578063b88d4fde146104c0578063c4ebdb7c146104dc578063c87b56dd146104f8576101cf565b806370a08231116100de57806370a082311461042e578063715018a61461045e5780638da5cb5b1461046857806395d89b4114610486576101cf565b80634f6ccce7146103b257806355f804b3146103e25780636352211e146103fe576101cf565b806316c61ccc1161017157806323b872dd1161014b57806323b872dd1461031a5780632f745c591461033657806342842e0e14610366578063438b630014610382576101cf565b806316c61ccc146102c257806318160ddd146102e05780632153ab0a146102fe576101cf565b806306fdde03116101ad57806306fdde031461023c578063081812fc1461025a578063095ea7b31461028a5780630d80bf64146102a6576101cf565b806301ffc9a7146101d457806302329a291461020457806304e8a66114610220575b600080fd5b6101ee60048036038101906101e99190612ead565b6105ae565b6040516101fb9190613abb565b60405180910390f35b61021e60048036038101906102199190612e84565b610628565b005b61023a60048036038101906102359190612f40565b6106c1565b005b61024461089a565b6040516102519190613ad6565b60405180910390f35b610274600480360381019061026f9190612f40565b61092c565b6040516102819190613a32565b60405180910390f35b6102a4600480360381019061029f9190612e48565b6109b1565b005b6102c060048036038101906102bb9190612eff565b610ac9565b005b6102ca610b5f565b6040516102d79190613abb565b60405180910390f35b6102e8610b72565b6040516102f59190613e38565b60405180910390f35b61031860048036038101906103139190612eff565b610b7f565b005b610334600480360381019061032f9190612d42565b610d90565b005b610350600480360381019061034b9190612e48565b610df0565b60405161035d9190613e38565b60405180910390f35b610380600480360381019061037b9190612d42565b610e95565b005b61039c60048036038101906103979190612cdd565b610eb5565b6040516103a99190613a99565b60405180910390f35b6103cc60048036038101906103c79190612f40565b610faf565b6040516103d99190613e38565b60405180910390f35b6103fc60048036038101906103f79190612eff565b611046565b005b61041860048036038101906104139190612f40565b6110dc565b6040516104259190613a32565b60405180910390f35b61044860048036038101906104439190612cdd565b61118e565b6040516104559190613e38565b60405180910390f35b610466611246565b005b6104706112ce565b60405161047d9190613a32565b60405180910390f35b61048e6112f8565b60405161049b9190613ad6565b60405180910390f35b6104be60048036038101906104b99190612e0c565b61138a565b005b6104da60048036038101906104d59190612d91565b61150b565b005b6104f660048036038101906104f19190612e84565b61156d565b005b610512600480360381019061050d9190612f40565b611606565b60405161051f9190613ad6565b60405180910390f35b610542600480360381019061053d9190612e48565b6116ad565b005b61055e60048036038101906105599190612d06565b6117cc565b60405161056b9190613abb565b60405180910390f35b61058e60048036038101906105899190612cdd565b611860565b005b610598611958565b6040516105a59190613abb565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061062157506106208261196b565b5b9050919050565b610630611a4d565b73ffffffffffffffffffffffffffffffffffffffff1661064e6112ce565b73ffffffffffffffffffffffffffffffffffffffff16146106a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069b90613d38565b60405180910390fd5b80600d60006101000a81548160ff02191690831515021790555050565b60006106cb610b72565b90506000339050600d60009054906101000a900460ff1615610722576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071990613af8565b60405180910390fd5b600c54611b596107329190614007565b838361073e9190613f80565b1061077e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077590613dd8565b60405180910390fd5b600b83601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546107cb9190613f80565b1061080b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080290613db8565b60405180910390fd5b60005b8381101561083e5761082b8282856108269190613f80565b611a55565b808061083690614123565b91505061080e565b5082601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461088e9190613f80565b92505081905550505050565b6060600080546108a9906140f1565b80601f01602080910402602001604051908101604052809291908181526020018280546108d5906140f1565b80156109225780601f106108f757610100808354040283529160200191610922565b820191906000526020600020905b81548152906001019060200180831161090557829003601f168201915b5050505050905090565b600061093782611a73565b610976576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096d90613d18565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109bc826110dc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2490613d98565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a4c611a4d565b73ffffffffffffffffffffffffffffffffffffffff161480610a7b5750610a7a81610a75611a4d565b6117cc565b5b610aba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab190613c38565b60405180910390fd5b610ac48383611adf565b505050565b610ad1611a4d565b73ffffffffffffffffffffffffffffffffffffffff16610aef6112ce565b73ffffffffffffffffffffffffffffffffffffffff1614610b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3c90613d38565b60405180910390fd5b80600e9080519060200190610b5b929190612b01565b5050565b600d60009054906101000a900460ff1681565b6000600880549050905090565b6000610b89610b72565b90506000339050600d60019054906101000a900460ff1615610be0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd790613b98565b60405180910390fd5b600c546109c5610bf09190614007565b600183610bfd9190613f80565b10610c3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3490613c18565b60405180910390fd5b600e604051610c4c91906139f7565b6040518091039020838051906020012014610c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9390613c58565b60405180910390fd5b600f60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610d29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2090613cb8565b60405180910390fd5b610d333383611a55565b6001600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550505050565b610da1610d9b611a4d565b82611b98565b610de0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd790613df8565b60405180910390fd5b610deb838383611c76565b505050565b6000610dfb8361118e565b8210610e3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3390613b18565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610eb08383836040518060200160405280600081525061150b565b505050565b60606000610ec28361118e565b905060008167ffffffffffffffff811115610f06577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610f345781602001602082028036833780820191505090505b50905060005b82811015610fa457610f4c8582610df0565b828281518110610f85577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080610f9c90614123565b915050610f3a565b508092505050919050565b6000610fb9610b72565b8210610ffa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff190613e18565b60405180910390fd5b60088281548110611034577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b61104e611a4d565b73ffffffffffffffffffffffffffffffffffffffff1661106c6112ce565b73ffffffffffffffffffffffffffffffffffffffff16146110c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b990613d38565b60405180910390fd5b80600b90805190602001906110d8929190612b01565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611185576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117c90613c98565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f690613c78565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61124e611a4d565b73ffffffffffffffffffffffffffffffffffffffff1661126c6112ce565b73ffffffffffffffffffffffffffffffffffffffff16146112c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b990613d38565b60405180910390fd5b6112cc6000611ed2565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611307906140f1565b80601f0160208091040260200160405190810160405280929190818152602001828054611333906140f1565b80156113805780601f1061135557610100808354040283529160200191611380565b820191906000526020600020905b81548152906001019060200180831161136357829003601f168201915b5050505050905090565b611392611a4d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611400576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f790613bd8565b60405180910390fd5b806005600061140d611a4d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114ba611a4d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114ff9190613abb565b60405180910390a35050565b61151c611516611a4d565b83611b98565b61155b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155290613df8565b60405180910390fd5b61156784848484611f98565b50505050565b611575611a4d565b73ffffffffffffffffffffffffffffffffffffffff166115936112ce565b73ffffffffffffffffffffffffffffffffffffffff16146115e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e090613d38565b60405180910390fd5b80600d60016101000a81548160ff02191690831515021790555050565b606061161182611a73565b611650576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164790613d78565b60405180910390fd5b600061165a611ff4565b9050600081511161167a57604051806020016040528060008152506116a5565b8061168484612086565b604051602001611695929190613a0e565b6040516020818303038152906040525b915050919050565b6116b5611a4d565b73ffffffffffffffffffffffffffffffffffffffff166116d36112ce565b73ffffffffffffffffffffffffffffffffffffffff1614611729576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172090613d38565b60405180910390fd5b600c5481111561176e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176590613cd8565b60405180910390fd5b6000611778610b72565b905060005b828110156117ad5761179a8482846117959190613f80565b611a55565b80806117a590614123565b91505061177d565b5081600c60008282546117c09190614007565b92505081905550505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611868611a4d565b73ffffffffffffffffffffffffffffffffffffffff166118866112ce565b73ffffffffffffffffffffffffffffffffffffffff16146118dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d390613d38565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561194c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194390613b58565b60405180910390fd5b61195581611ed2565b50565b600d60019054906101000a900460ff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611a3657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611a465750611a4582612233565b5b9050919050565b600033905090565b611a6f82826040518060200160405280600081525061229d565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611b52836110dc565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611ba382611a73565b611be2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd990613bf8565b60405180910390fd5b6000611bed836110dc565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c5c57508373ffffffffffffffffffffffffffffffffffffffff16611c448461092c565b73ffffffffffffffffffffffffffffffffffffffff16145b80611c6d5750611c6c81856117cc565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611c96826110dc565b73ffffffffffffffffffffffffffffffffffffffff1614611cec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce390613d58565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5390613bb8565b60405180910390fd5b611d678383836122f8565b611d72600082611adf565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dc29190614007565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e199190613f80565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611fa3848484611c76565b611faf8484848461240c565b611fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe590613b38565b60405180910390fd5b50505050565b6060600b8054612003906140f1565b80601f016020809104026020016040519081016040528092919081815260200182805461202f906140f1565b801561207c5780601f106120515761010080835404028352916020019161207c565b820191906000526020600020905b81548152906001019060200180831161205f57829003601f168201915b5050505050905090565b606060008214156120ce576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061222e565b600082905060005b600082146121005780806120e990614123565b915050600a826120f99190613fd6565b91506120d6565b60008167ffffffffffffffff811115612142577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156121745781602001600182028036833780820191505090505b5090505b600085146122275760018261218d9190614007565b9150600a8561219c919061416c565b60306121a89190613f80565b60f81b8183815181106121e4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856122209190613fd6565b9450612178565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6122a783836125a3565b6122b4600084848461240c565b6122f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ea90613b38565b60405180910390fd5b505050565b612303838383612771565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156123465761234181612776565b612385565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146123845761238383826127bf565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123c8576123c38161292c565b612407565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612406576124058282612a6f565b5b5b505050565b600061242d8473ffffffffffffffffffffffffffffffffffffffff16612aee565b15612596578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612456611a4d565b8786866040518563ffffffff1660e01b81526004016124789493929190613a4d565b602060405180830381600087803b15801561249257600080fd5b505af19250505080156124c357506040513d601f19601f820116820180604052508101906124c09190612ed6565b60015b612546573d80600081146124f3576040519150601f19603f3d011682016040523d82523d6000602084013e6124f8565b606091505b5060008151141561253e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253590613b38565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061259b565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612613576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260a90613cf8565b60405180910390fd5b61261c81611a73565b1561265c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265390613b78565b60405180910390fd5b612668600083836122f8565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126b89190613f80565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016127cc8461118e565b6127d69190614007565b90506000600760008481526020019081526020016000205490508181146128bb576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506129409190614007565b9050600060096000848152602001908152602001600020549050600060088381548110612996577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106129de577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612a53577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612a7a8361118e565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054612b0d906140f1565b90600052602060002090601f016020900481019282612b2f5760008555612b76565b82601f10612b4857805160ff1916838001178555612b76565b82800160010185558215612b76579182015b82811115612b75578251825591602001919060010190612b5a565b5b509050612b839190612b87565b5090565b5b80821115612ba0576000816000905550600101612b88565b5090565b6000612bb7612bb284613e84565b613e53565b905082815260208101848484011115612bcf57600080fd5b612bda8482856140af565b509392505050565b6000612bf5612bf084613eb4565b613e53565b905082815260208101848484011115612c0d57600080fd5b612c188482856140af565b509392505050565b600081359050612c2f8161426a565b92915050565b600081359050612c4481614281565b92915050565b600081359050612c5981614298565b92915050565b600081519050612c6e81614298565b92915050565b600082601f830112612c8557600080fd5b8135612c95848260208601612ba4565b91505092915050565b600082601f830112612caf57600080fd5b8135612cbf848260208601612be2565b91505092915050565b600081359050612cd7816142af565b92915050565b600060208284031215612cef57600080fd5b6000612cfd84828501612c20565b91505092915050565b60008060408385031215612d1957600080fd5b6000612d2785828601612c20565b9250506020612d3885828601612c20565b9150509250929050565b600080600060608486031215612d5757600080fd5b6000612d6586828701612c20565b9350506020612d7686828701612c20565b9250506040612d8786828701612cc8565b9150509250925092565b60008060008060808587031215612da757600080fd5b6000612db587828801612c20565b9450506020612dc687828801612c20565b9350506040612dd787828801612cc8565b925050606085013567ffffffffffffffff811115612df457600080fd5b612e0087828801612c74565b91505092959194509250565b60008060408385031215612e1f57600080fd5b6000612e2d85828601612c20565b9250506020612e3e85828601612c35565b9150509250929050565b60008060408385031215612e5b57600080fd5b6000612e6985828601612c20565b9250506020612e7a85828601612cc8565b9150509250929050565b600060208284031215612e9657600080fd5b6000612ea484828501612c35565b91505092915050565b600060208284031215612ebf57600080fd5b6000612ecd84828501612c4a565b91505092915050565b600060208284031215612ee857600080fd5b6000612ef684828501612c5f565b91505092915050565b600060208284031215612f1157600080fd5b600082013567ffffffffffffffff811115612f2b57600080fd5b612f3784828501612c9e565b91505092915050565b600060208284031215612f5257600080fd5b6000612f6084828501612cc8565b91505092915050565b6000612f7583836139d9565b60208301905092915050565b612f8a8161403b565b82525050565b6000612f9b82613f09565b612fa58185613f37565b9350612fb083613ee4565b8060005b83811015612fe1578151612fc88882612f69565b9750612fd383613f2a565b925050600181019050612fb4565b5085935050505092915050565b612ff78161404d565b82525050565b600061300882613f14565b6130128185613f48565b93506130228185602086016140be565b61302b81614259565b840191505092915050565b60008154613043816140f1565b61304d8186613f59565b945060018216600081146130685760018114613079576130ac565b60ff198316865281860193506130ac565b61308285613ef4565b60005b838110156130a457815481890152600182019150602081019050613085565b838801955050505b50505092915050565b60006130c082613f1f565b6130ca8185613f64565b93506130da8185602086016140be565b6130e381614259565b840191505092915050565b60006130f982613f1f565b6131038185613f75565b93506131138185602086016140be565b80840191505092915050565b600061312c600b83613f64565b91507f53616c65207061757365640000000000000000000000000000000000000000006000830152602082019050919050565b600061316c602b83613f64565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006131d2603283613f64565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613238602683613f64565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061329e601c83613f64565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006132de601283613f64565b91507f57686974656c69737420736f6c64206f757400000000000000000000000000006000830152602082019050919050565b600061331e602483613f64565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613384601983613f64565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006133c4602c83613f64565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061342a602083613f64565b91507f45786365656473206d6178696d756d2077686974656c69737420737570706c796000830152602082019050919050565b600061346a603883613f64565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b60006134d0600f83613f64565b91507f4e6f742077686974656c697374656400000000000000000000000000000000006000830152602082019050919050565b6000613510602a83613f64565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613576602983613f64565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006135dc601b83613f64565b91507f416c7265616479206d696e74656420696e2077686974656c69737400000000006000830152602082019050919050565b600061361c602c83613f64565b91507f416d6f756e74206578636565647320726573657276656420616d6f756e74206660008301527f6f722067697665617761797300000000000000000000000000000000000000006020830152604082019050919050565b6000613682602083613f64565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006136c2602c83613f64565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613728602083613f64565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613768602983613f64565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006137ce602f83613f64565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613834602183613f64565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061389a601b83613f64565b91507f43616e206f6e6c79206d696e74203130207065722077616c6c657400000000006000830152602082019050919050565b60006138da601683613f64565b91507f45786365656473206d6178696d756d20737570706c79000000000000000000006000830152602082019050919050565b600061391a603183613f64565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613980602c83613f64565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6139e2816140a5565b82525050565b6139f1816140a5565b82525050565b6000613a038284613036565b915081905092915050565b6000613a1a82856130ee565b9150613a2682846130ee565b91508190509392505050565b6000602082019050613a476000830184612f81565b92915050565b6000608082019050613a626000830187612f81565b613a6f6020830186612f81565b613a7c60408301856139e8565b8181036060830152613a8e8184612ffd565b905095945050505050565b60006020820190508181036000830152613ab38184612f90565b905092915050565b6000602082019050613ad06000830184612fee565b92915050565b60006020820190508181036000830152613af081846130b5565b905092915050565b60006020820190508181036000830152613b118161311f565b9050919050565b60006020820190508181036000830152613b318161315f565b9050919050565b60006020820190508181036000830152613b51816131c5565b9050919050565b60006020820190508181036000830152613b718161322b565b9050919050565b60006020820190508181036000830152613b9181613291565b9050919050565b60006020820190508181036000830152613bb1816132d1565b9050919050565b60006020820190508181036000830152613bd181613311565b9050919050565b60006020820190508181036000830152613bf181613377565b9050919050565b60006020820190508181036000830152613c11816133b7565b9050919050565b60006020820190508181036000830152613c318161341d565b9050919050565b60006020820190508181036000830152613c518161345d565b9050919050565b60006020820190508181036000830152613c71816134c3565b9050919050565b60006020820190508181036000830152613c9181613503565b9050919050565b60006020820190508181036000830152613cb181613569565b9050919050565b60006020820190508181036000830152613cd1816135cf565b9050919050565b60006020820190508181036000830152613cf18161360f565b9050919050565b60006020820190508181036000830152613d1181613675565b9050919050565b60006020820190508181036000830152613d31816136b5565b9050919050565b60006020820190508181036000830152613d518161371b565b9050919050565b60006020820190508181036000830152613d718161375b565b9050919050565b60006020820190508181036000830152613d91816137c1565b9050919050565b60006020820190508181036000830152613db181613827565b9050919050565b60006020820190508181036000830152613dd18161388d565b9050919050565b60006020820190508181036000830152613df1816138cd565b9050919050565b60006020820190508181036000830152613e118161390d565b9050919050565b60006020820190508181036000830152613e3181613973565b9050919050565b6000602082019050613e4d60008301846139e8565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613e7a57613e7961422a565b5b8060405250919050565b600067ffffffffffffffff821115613e9f57613e9e61422a565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613ecf57613ece61422a565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613f8b826140a5565b9150613f96836140a5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613fcb57613fca61419d565b5b828201905092915050565b6000613fe1826140a5565b9150613fec836140a5565b925082613ffc57613ffb6141cc565b5b828204905092915050565b6000614012826140a5565b915061401d836140a5565b9250828210156140305761402f61419d565b5b828203905092915050565b600061404682614085565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156140dc5780820151818401526020810190506140c1565b838111156140eb576000848401525b50505050565b6000600282049050600182168061410957607f821691505b6020821081141561411d5761411c6141fb565b5b50919050565b600061412e826140a5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156141615761416061419d565b5b600182019050919050565b6000614177826140a5565b9150614182836140a5565b925082614192576141916141cc565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6142738161403b565b811461427e57600080fd5b50565b61428a8161404d565b811461429557600080fd5b50565b6142a181614059565b81146142ac57600080fd5b50565b6142b8816140a5565b81146142c357600080fd5b5056fea26469706673582212202aafb7e351a32ebaa8678e6888a8c6d5760d5d7f3eb010d68cbace937602b0bc64736f6c63430008000033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : baseURI (string):

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

38360:2424:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32731:215;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40642:65;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38853:413;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22053:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23447:206;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23033:360;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40263:77;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38503:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33323:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39271:474;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24256:297;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33018:241;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24612:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39750:300;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33492:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40165:93;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21780:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21537:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12023:94;;;:::i;:::-;;11432:78;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22201:95;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23713:274;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24826:286;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40712:69;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22355:313;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40345:292;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24046:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12257:186;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38533:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32731:215;32833:4;32866:35;32851:50;;;:11;:50;;;;:90;;;;32905:36;32929:11;32905:23;:36::i;:::-;32851:90;32844:97;;32731:215;;;:::o;40642:65::-;11636:12;:10;:12::i;:::-;11625:23;;:7;:5;:7::i;:::-;:23;;;11617:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40699:3:::1;40689:7;;:13;;;;;;;;;;;;;;;;;;40642:65:::0;:::o;38853:413::-;38900:14;38917:13;:11;:13::i;:::-;38900:30;;38935:14;38952:10;38935:27;;38977:7;;;;;;;;;;;38976:8;38967:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;39037:9;;39030:4;:16;;;;:::i;:::-;39024:3;39015:6;:12;;;;:::i;:::-;:31;39006:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39118:2;39112:3;39088:13;:21;39102:6;39088:21;;;;;;;;;;;;;;;;:27;;;;:::i;:::-;:32;39079:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;39164:9;39160:69;39179:3;39175:1;:7;39160:69;;;39194:29;39204:6;39221:1;39212:6;:10;;;;:::i;:::-;39194:9;:29::i;:::-;39184:3;;;;;:::i;:::-;;;;39160:69;;;;39258:3;39233:13;:21;39247:6;39233:21;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;38853:413;;;:::o;22053:91::-;22107:13;22134:5;22127:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22053:91;:::o;23447:206::-;23523:7;23545:16;23553:7;23545;:16::i;:::-;23537:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23624:15;:24;23640:7;23624:24;;;;;;;;;;;;;;;;;;;;;23617:31;;23447:206;;;:::o;23033:360::-;23108:13;23124:23;23139:7;23124:14;:23::i;:::-;23108:39;;23166:5;23160:11;;:2;:11;;;;23152:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23245:5;23229:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23254:37;23271:5;23278:12;:10;:12::i;:::-;23254:16;:37::i;:::-;23229:62;23216:144;;;;;;;;;;;;:::i;:::-;;;;;;;;;23367:21;23376:2;23380:7;23367:8;:21::i;:::-;23033:360;;;:::o;40263:77::-;11636:12;:10;:12::i;:::-;11625:23;;:7;:5;:7::i;:::-;:23;;;11617:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40331:4:::1;40324;:11;;;;;;;;;;;;:::i;:::-;;40263:77:::0;:::o;38503:26::-;;;;;;;;;;;;;:::o;33323:104::-;33384:7;33405:10;:17;;;;33398:24;;33323:104;:::o;39271:474::-;39325:14;39342:13;:11;:13::i;:::-;39325:30;;39360:14;39377:10;39360:27;;39402:9;;;;;;;;;;;39401:10;39392:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;39469:9;;39462:4;:16;;;;:::i;:::-;39458:1;39449:6;:10;;;;:::i;:::-;:29;39440:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;39570:4;39554:22;;;;;;:::i;:::-;;;;;;;;39546:2;39530:20;;;;;;:46;39521:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;39612:16;:24;39629:6;39612:24;;;;;;;;;;;;;;;;;;;;;;;;;39611:25;39602:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;39675:29;39685:10;39697:6;39675:9;:29::i;:::-;39736:4;39709:16;:24;39726:6;39709:24;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;39271:474;;;:::o;24256:297::-;24418:41;24437:12;:10;:12::i;:::-;24451:7;24418:18;:41::i;:::-;24410:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24520:28;24530:4;24536:2;24540:7;24520:9;:28::i;:::-;24256:297;;;:::o;33018:241::-;33115:7;33145:23;33162:5;33145:16;:23::i;:::-;33137:5;:31;33129:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;33228:12;:19;33241:5;33228:19;;;;;;;;;;;;;;;:26;33248:5;33228:26;;;;;;;;;;;;33221:33;;33018:241;;;;:::o;24612:155::-;24723:39;24740:4;24746:2;24750:7;24723:39;;;;;;;;;;;;:16;:39::i;:::-;24612:155;;;:::o;39750:300::-;39809:16;39832:18;39853:17;39863:6;39853:9;:17::i;:::-;39832:38;;39877:25;39919:10;39905:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39877:53;;39939:9;39935:91;39954:10;39950:1;:14;39935:91;;;39990:30;40010:6;40018:1;39990:19;:30::i;:::-;39976:8;39985:1;39976:11;;;;;;;;;;;;;;;;;;;;;:44;;;;;39966:3;;;;;:::i;:::-;;;;39935:91;;;;40037:8;40030:15;;;;39750:300;;;:::o;33492:218::-;33567:7;33597:30;:28;:30::i;:::-;33589:5;:38;33581:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;33688:10;33699:5;33688:17;;;;;;;;;;;;;;;;;;;;;;;;33681:24;;33492:218;;;:::o;40165:93::-;11636:12;:10;:12::i;:::-;11625:23;;:7;:5;:7::i;:::-;:23;;;11617:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40246:7:::1;40230:13;:23;;;;;;;;;;;;:::i;:::-;;40165:93:::0;:::o;21780:218::-;21852:7;21866:13;21882:7;:16;21890:7;21882:16;;;;;;;;;;;;;;;;;;;;;21866:32;;21928:1;21911:19;;:5;:19;;;;21903:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21988:5;21981:12;;;21780:218;;;:::o;21537:193::-;21609:7;21648:1;21631:19;;:5;:19;;;;21623:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21709:9;:16;21719:5;21709:16;;;;;;;;;;;;;;;;21702:23;;21537:193;;;:::o;12023:94::-;11636:12;:10;:12::i;:::-;11625:23;;:7;:5;:7::i;:::-;:23;;;11617:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12082:30:::1;12109:1;12082:18;:30::i;:::-;12023:94::o:0;11432:78::-;11478:7;11499:6;;;;;;;;;;;11492:13;;11432:78;:::o;22201:95::-;22257:13;22284:7;22277:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22201:95;:::o;23713:274::-;23822:12;:10;:12::i;:::-;23810:24;;:8;:24;;;;23802:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23916:8;23871:18;:32;23890:12;:10;:12::i;:::-;23871:32;;;;;;;;;;;;;;;:42;23904:8;23871:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23963:8;23934:48;;23949:12;:10;:12::i;:::-;23934:48;;;23973:8;23934:48;;;;;;:::i;:::-;;;;;;;;23713:274;;:::o;24826:286::-;24968:41;24987:12;:10;:12::i;:::-;25001:7;24968:18;:41::i;:::-;24960:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25068:39;25082:4;25088:2;25092:7;25101:5;25068:13;:39::i;:::-;24826:286;;;;:::o;40712:69::-;11636:12;:10;:12::i;:::-;11625:23;;:7;:5;:7::i;:::-;:23;;;11617:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40773:3:::1;40761:9;;:15;;;;;;;;;;;;;;;;;;40712:69:::0;:::o;22355:313::-;22428:13;22456:16;22464:7;22456;:16::i;:::-;22448:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22531:21;22555:10;:8;:10::i;:::-;22531:34;;22601:1;22583:7;22577:21;:25;:86;;;;;;;;;;;;;;;;;22629:7;22638:18;:7;:16;:18::i;:::-;22612:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22577:86;22570:93;;;22355:313;;;:::o;40345:292::-;11636:12;:10;:12::i;:::-;11625:23;;:7;:5;:7::i;:::-;:23;;;11617:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40437:9:::1;;40426:7;:20;;40417:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;40501:14;40518:13;:11;:13::i;:::-;40501:30;;40540:9;40536:72;40555:7;40551:1;:11;40536:72;;;40574:28;40585:3;40599:1;40590:6;:10;;;;:::i;:::-;40574:9;:28::i;:::-;40564:3;;;;;:::i;:::-;;;;40536:72;;;;40625:7;40612:9;;:20;;;;;;;:::i;:::-;;;;;;;;11690:1;40345:292:::0;;:::o;24046:155::-;24143:4;24161:18;:25;24180:5;24161:25;;;;;;;;;;;;;;;:35;24187:8;24161:35;;;;;;;;;;;;;;;;;;;;;;;;;24154:42;;24046:155;;;;:::o;12257:186::-;11636:12;:10;:12::i;:::-;11625:23;;:7;:5;:7::i;:::-;:23;;;11617:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12360:1:::1;12340:22;;:8;:22;;;;12332:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;12410:28;12429:8;12410:18;:28::i;:::-;12257:186:::0;:::o;38533:28::-;;;;;;;;;;;;;:::o;21216:269::-;21318:4;21355:25;21340:40;;;:11;:40;;;;:96;;;;21403:33;21388:48;;;:11;:48;;;;21340:96;:140;;;;21444:36;21468:11;21444:23;:36::i;:::-;21340:140;21329:151;;21216:269;;;:::o;10359:89::-;10412:7;10433:10;10426:17;;10359:89;:::o;27393:101::-;27463:26;27473:2;27477:7;27463:26;;;;;;;;;;;;:9;:26::i;:::-;27393:101;;:::o;26496:118::-;26561:4;26607:1;26579:30;;:7;:16;26587:7;26579:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26572:37;;26496:118;;;:::o;30019:159::-;30115:2;30088:15;:24;30104:7;30088:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30165:7;30161:2;30127:46;;30136:23;30151:7;30136:14;:23::i;:::-;30127:46;;;;;;;;;;;;30019:159;;:::o;26757:327::-;26850:4;26869:16;26877:7;26869;:16::i;:::-;26861:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26939:13;26955:23;26970:7;26955:14;:23::i;:::-;26939:39;;27002:5;26991:16;;:7;:16;;;:51;;;;27035:7;27011:31;;:20;27023:7;27011:11;:20::i;:::-;:31;;;26991:51;:87;;;;27046:32;27063:5;27070:7;27046:16;:32::i;:::-;26991:87;26983:96;;;26757:327;;;;:::o;29419:500::-;29551:4;29524:31;;:23;29539:7;29524:14;:23::i;:::-;:31;;;29516:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29628:1;29614:16;;:2;:16;;;;29606:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29678:39;29699:4;29705:2;29709:7;29678:20;:39::i;:::-;29770:29;29787:1;29791:7;29770:8;:29::i;:::-;29825:1;29806:9;:15;29816:4;29806:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29848:1;29831:9;:13;29841:2;29831:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29873:2;29854:7;:16;29862:7;29854:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29906:7;29902:2;29887:27;;29896:4;29887:27;;;;;;;;;;;;29419:500;;;:::o;12588:170::-;12656:16;12675:6;;;;;;;;;;;12656:25;;12695:8;12686:6;;:17;;;;;;;;;;;;;;;;;;12744:8;12713:40;;12734:8;12713:40;;;;;;;;;;;;12588:170;;:::o;25937:273::-;26061:28;26071:4;26077:2;26081:7;26061:9;:28::i;:::-;26102:48;26125:4;26131:2;26135:7;26144:5;26102:22;:48::i;:::-;26094:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25937:273;;;;:::o;40055:105::-;40115:13;40142;40135:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40055:105;:::o;344:594::-;400:13;612:1;603:5;:10;599:38;;;621:10;;;;;;;;;;;;;;;;;;;;;599:38;641:12;656:5;641:20;;666:14;685:54;700:1;692:4;:9;685:54;;709:8;;;;;:::i;:::-;;;;731:2;723:10;;;;;:::i;:::-;;;685:54;;;743:19;775:6;765:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;743:39;;787:121;803:1;794:5;:10;787:121;;822:1;812:11;;;;;:::i;:::-;;;880:2;872:5;:10;;;;:::i;:::-;859:2;:24;;;;:::i;:::-;846:39;;829:6;836;829:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;900:2;891:11;;;;;:::i;:::-;;;787:121;;;926:6;912:21;;;;;344:594;;;;:::o;14176:148::-;14261:4;14294:25;14279:40;;;:11;:40;;;;14272:47;;14176:148;;;:::o;27706:261::-;27809:18;27815:2;27819:7;27809:5;:18::i;:::-;27845:54;27876:1;27880:2;27884:7;27893:5;27845:22;:54::i;:::-;27832:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;27706:261;;;:::o;34275:487::-;34392:45;34419:4;34425:2;34429:7;34392:26;:45::i;:::-;34464:1;34448:18;;:4;:18;;;34444:157;;;34474:40;34506:7;34474:31;:40::i;:::-;34444:157;;;34538:2;34530:10;;:4;:10;;;34526:75;;34548:47;34581:4;34587:7;34548:32;:47::i;:::-;34526:75;34444:157;34623:1;34609:16;;:2;:16;;;34605:153;;;34633:45;34670:7;34633:36;:45::i;:::-;34605:153;;;34700:4;34694:10;;:2;:10;;;34690:68;;34712:40;34740:2;34744:7;34712:27;:40::i;:::-;34690:68;34605:153;34275:487;;;:::o;30710:604::-;30838:4;30853:15;:2;:13;;;:15::i;:::-;30849:461;;;30896:2;30880:36;;;30917:12;:10;:12::i;:::-;30931:4;30937:7;30946:5;30880:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30876:400;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31106:1;31089:6;:13;:18;31085:185;;;31117:60;;;;;;;;;;:::i;:::-;;;;;;;;31085:185;31247:6;31241:13;31232:6;31228:2;31224:15;31217:38;30876:400;31001:41;;;30991:51;;;:6;:51;;;;30984:58;;;;;30849:461;31300:4;31293:11;;30710:604;;;;;;;:::o;28264:343::-;28352:1;28338:16;;:2;:16;;;;28330:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28405:16;28413:7;28405;:16::i;:::-;28404:17;28396:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28461:45;28490:1;28494:2;28498:7;28461:20;:45::i;:::-;28530:1;28513:9;:13;28523:2;28513:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28555:2;28536:7;:16;28544:7;28536:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28594:7;28590:2;28569:33;;28586:1;28569:33;;;;;;;;;;;;28264:343;;:::o;31841:105::-;;;;:::o;35431:149::-;35529:10;:17;;;;35502:15;:24;35518:7;35502:24;;;;;;;;;;;:44;;;;35551:10;35567:7;35551:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35431:149;:::o;36180:898::-;36428:22;36478:1;36453:22;36470:4;36453:16;:22::i;:::-;:26;;;;:::i;:::-;36428:51;;36484:18;36505:17;:26;36523:7;36505:26;;;;;;;;;;;;36484:47;;36640:14;36626:10;:28;36622:295;;36662:19;36684:12;:18;36697:4;36684:18;;;;;;;;;;;;;;;:34;36703:14;36684:34;;;;;;;;;;;;36662:56;;36759:11;36726:12;:18;36739:4;36726:18;;;;;;;;;;;;;;;:30;36745:10;36726:30;;;;;;;;;;;:44;;;;36867:10;36834:17;:30;36852:11;36834:30;;;;;;;;;;;:43;;;;36622:295;;37001:17;:26;37019:7;37001:26;;;;;;;;;;;36994:33;;;37039:12;:18;37052:4;37039:18;;;;;;;;;;;;;;;:34;37058:14;37039:34;;;;;;;;;;;37032:41;;;36180:898;;;;:::o;37355:998::-;37590:22;37635:1;37615:10;:17;;;;:21;;;;:::i;:::-;37590:46;;37641:18;37662:15;:24;37678:7;37662:24;;;;;;;;;;;;37641:45;;37989:19;38011:10;38022:14;38011:26;;;;;;;;;;;;;;;;;;;;;;;;37989:48;;38069:11;38044:10;38055;38044:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;38174:10;38143:15;:28;38159:11;38143:28;;;;;;;;;;;:41;;;;38303:15;:24;38319:7;38303:24;;;;;;;;;;;38296:31;;;38332:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37355:998;;;;:::o;35045:200::-;35124:14;35141:20;35158:2;35141:16;:20::i;:::-;35124:37;;35193:7;35166:12;:16;35179:2;35166:16;;;;;;;;;;;;;;;:24;35183:6;35166:24;;;;;;;;;;;:34;;;;35234:6;35205:17;:26;35223:7;35205:26;;;;;;;;;;;:35;;;;35045:200;;;:::o;3247:333::-;3307:4;3491:12;3543:7;3531:20;3523:28;;3574:1;3567:4;:8;3560:15;;;3247:333;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:273::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:79;1846:3;1838:6;1831:4;1823:6;1819:17;1771:79;:::i;:::-;1762:88;;1645:211;;;;;:::o;1862:139::-;;1946:6;1933:20;1924:29;;1962:33;1989:5;1962:33;:::i;:::-;1914:87;;;;:::o;2007:262::-;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2131:1;2128;2121:12;2083:2;2174:1;2199:53;2244:7;2235:6;2224:9;2220:22;2199:53;:::i;:::-;2189:63;;2145:117;2073:196;;;;:::o;2275:407::-;;;2400:2;2388:9;2379:7;2375:23;2371:32;2368:2;;;2416:1;2413;2406:12;2368:2;2459:1;2484:53;2529:7;2520:6;2509:9;2505:22;2484:53;:::i;:::-;2474:63;;2430:117;2586:2;2612:53;2657:7;2648:6;2637:9;2633:22;2612:53;:::i;:::-;2602:63;;2557:118;2358:324;;;;;:::o;2688:552::-;;;;2830:2;2818:9;2809:7;2805:23;2801:32;2798:2;;;2846:1;2843;2836:12;2798:2;2889:1;2914:53;2959:7;2950:6;2939:9;2935:22;2914:53;:::i;:::-;2904:63;;2860:117;3016:2;3042:53;3087:7;3078:6;3067:9;3063:22;3042:53;:::i;:::-;3032:63;;2987:118;3144:2;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3115:118;2788:452;;;;;:::o;3246:809::-;;;;;3414:3;3402:9;3393:7;3389:23;3385:33;3382:2;;;3431:1;3428;3421:12;3382:2;3474:1;3499:53;3544:7;3535:6;3524:9;3520:22;3499:53;:::i;:::-;3489:63;;3445:117;3601:2;3627:53;3672:7;3663:6;3652:9;3648:22;3627:53;:::i;:::-;3617:63;;3572:118;3729:2;3755:53;3800:7;3791:6;3780:9;3776:22;3755:53;:::i;:::-;3745:63;;3700:118;3885:2;3874:9;3870:18;3857:32;3916:18;3908:6;3905:30;3902:2;;;3948:1;3945;3938:12;3902:2;3976:62;4030:7;4021:6;4010:9;4006:22;3976:62;:::i;:::-;3966:72;;3828:220;3372:683;;;;;;;:::o;4061:401::-;;;4183:2;4171:9;4162:7;4158:23;4154:32;4151:2;;;4199:1;4196;4189:12;4151:2;4242:1;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4213:117;4369:2;4395:50;4437:7;4428:6;4417:9;4413:22;4395:50;:::i;:::-;4385:60;;4340:115;4141:321;;;;;:::o;4468:407::-;;;4593:2;4581:9;4572:7;4568:23;4564:32;4561:2;;;4609:1;4606;4599:12;4561:2;4652:1;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4623:117;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4551:324;;;;;:::o;4881:256::-;;4986:2;4974:9;4965:7;4961:23;4957:32;4954:2;;;5002:1;4999;4992:12;4954:2;5045:1;5070:50;5112:7;5103:6;5092:9;5088:22;5070:50;:::i;:::-;5060:60;;5016:114;4944:193;;;;:::o;5143:260::-;;5250:2;5238:9;5229:7;5225:23;5221:32;5218:2;;;5266:1;5263;5256:12;5218:2;5309:1;5334:52;5378:7;5369:6;5358:9;5354:22;5334:52;:::i;:::-;5324:62;;5280:116;5208:195;;;;:::o;5409:282::-;;5527:2;5515:9;5506:7;5502:23;5498:32;5495:2;;;5543:1;5540;5533:12;5495:2;5586:1;5611:63;5666:7;5657:6;5646:9;5642:22;5611:63;:::i;:::-;5601:73;;5557:127;5485:206;;;;:::o;5697:375::-;;5815:2;5803:9;5794:7;5790:23;5786:32;5783:2;;;5831:1;5828;5821:12;5783:2;5902:1;5891:9;5887:17;5874:31;5932:18;5924:6;5921:30;5918:2;;;5964:1;5961;5954:12;5918:2;5992:63;6047:7;6038:6;6027:9;6023:22;5992:63;:::i;:::-;5982:73;;5845:220;5773:299;;;;:::o;6078:262::-;;6186:2;6174:9;6165:7;6161:23;6157:32;6154:2;;;6202:1;6199;6192:12;6154:2;6245:1;6270:53;6315:7;6306:6;6295:9;6291:22;6270:53;:::i;:::-;6260:63;;6216:117;6144:196;;;;:::o;6346:179::-;;6436:46;6478:3;6470:6;6436:46;:::i;:::-;6514:4;6509:3;6505:14;6491:28;;6426:99;;;;:::o;6531:118::-;6618:24;6636:5;6618:24;:::i;:::-;6613:3;6606:37;6596:53;;:::o;6685:732::-;;6833:54;6881:5;6833:54;:::i;:::-;6903:86;6982:6;6977:3;6903:86;:::i;:::-;6896:93;;7013:56;7063:5;7013:56;:::i;:::-;7092:7;7123:1;7108:284;7133:6;7130:1;7127:13;7108:284;;;7209:6;7203:13;7236:63;7295:3;7280:13;7236:63;:::i;:::-;7229:70;;7322:60;7375:6;7322:60;:::i;:::-;7312:70;;7168:224;7155:1;7152;7148:9;7143:14;;7108:284;;;7112:14;7408:3;7401:10;;6809:608;;;;;;;:::o;7423:109::-;7504:21;7519:5;7504:21;:::i;:::-;7499:3;7492:34;7482:50;;:::o;7538:360::-;;7652:38;7684:5;7652:38;:::i;:::-;7706:70;7769:6;7764:3;7706:70;:::i;:::-;7699:77;;7785:52;7830:6;7825:3;7818:4;7811:5;7807:16;7785:52;:::i;:::-;7862:29;7884:6;7862:29;:::i;:::-;7857:3;7853:39;7846:46;;7628:270;;;;;:::o;7926:849::-;;8068:5;8062:12;8097:36;8123:9;8097:36;:::i;:::-;8149:88;8230:6;8225:3;8149:88;:::i;:::-;8142:95;;8268:1;8257:9;8253:17;8284:1;8279:137;;;;8430:1;8425:344;;;;8246:523;;8279:137;8363:4;8359:9;8348;8344:25;8339:3;8332:38;8399:6;8394:3;8390:16;8383:23;;8279:137;;8425:344;8492:41;8527:5;8492:41;:::i;:::-;8555:1;8569:154;8583:6;8580:1;8577:13;8569:154;;;8657:7;8651:14;8647:1;8642:3;8638:11;8631:35;8707:1;8698:7;8694:15;8683:26;;8605:4;8602:1;8598:12;8593:17;;8569:154;;;8752:6;8747:3;8743:16;8736:23;;8432:337;;8246:523;;8035:740;;;;;;:::o;8781:364::-;;8897:39;8930:5;8897:39;:::i;:::-;8952:71;9016:6;9011:3;8952:71;:::i;:::-;8945:78;;9032:52;9077:6;9072:3;9065:4;9058:5;9054:16;9032:52;:::i;:::-;9109:29;9131:6;9109:29;:::i;:::-;9104:3;9100:39;9093:46;;8873:272;;;;;:::o;9151:377::-;;9285:39;9318:5;9285:39;:::i;:::-;9340:89;9422:6;9417:3;9340:89;:::i;:::-;9333:96;;9438:52;9483:6;9478:3;9471:4;9464:5;9460:16;9438:52;:::i;:::-;9515:6;9510:3;9506:16;9499:23;;9261:267;;;;;:::o;9534:309::-;;9697:67;9761:2;9756:3;9697:67;:::i;:::-;9690:74;;9794:13;9790:1;9785:3;9781:11;9774:34;9834:2;9829:3;9825:12;9818:19;;9680:163;;;:::o;9849:375::-;;10012:67;10076:2;10071:3;10012:67;:::i;:::-;10005:74;;10109:34;10105:1;10100:3;10096:11;10089:55;10175:13;10170:2;10165:3;10161:12;10154:35;10215:2;10210:3;10206:12;10199:19;;9995:229;;;:::o;10230:382::-;;10393:67;10457:2;10452:3;10393:67;:::i;:::-;10386:74;;10490:34;10486:1;10481:3;10477:11;10470:55;10556:20;10551:2;10546:3;10542:12;10535:42;10603:2;10598:3;10594:12;10587:19;;10376:236;;;:::o;10618:370::-;;10781:67;10845:2;10840:3;10781:67;:::i;:::-;10774:74;;10878:34;10874:1;10869:3;10865:11;10858:55;10944:8;10939:2;10934:3;10930:12;10923:30;10979:2;10974:3;10970:12;10963:19;;10764:224;;;:::o;10994:326::-;;11157:67;11221:2;11216:3;11157:67;:::i;:::-;11150:74;;11254:30;11250:1;11245:3;11241:11;11234:51;11311:2;11306:3;11302:12;11295:19;;11140:180;;;:::o;11326:316::-;;11489:67;11553:2;11548:3;11489:67;:::i;:::-;11482:74;;11586:20;11582:1;11577:3;11573:11;11566:41;11633:2;11628:3;11624:12;11617:19;;11472:170;;;:::o;11648:368::-;;11811:67;11875:2;11870:3;11811:67;:::i;:::-;11804:74;;11908:34;11904:1;11899:3;11895:11;11888:55;11974:6;11969:2;11964:3;11960:12;11953:28;12007:2;12002:3;11998:12;11991:19;;11794:222;;;:::o;12022:323::-;;12185:67;12249:2;12244:3;12185:67;:::i;:::-;12178:74;;12282:27;12278:1;12273:3;12269:11;12262:48;12336:2;12331:3;12327:12;12320:19;;12168:177;;;:::o;12351:376::-;;12514:67;12578:2;12573:3;12514:67;:::i;:::-;12507:74;;12611:34;12607:1;12602:3;12598:11;12591:55;12677:14;12672:2;12667:3;12663:12;12656:36;12718:2;12713:3;12709:12;12702:19;;12497:230;;;:::o;12733:330::-;;12896:67;12960:2;12955:3;12896:67;:::i;:::-;12889:74;;12993:34;12989:1;12984:3;12980:11;12973:55;13054:2;13049:3;13045:12;13038:19;;12879:184;;;:::o;13069:388::-;;13232:67;13296:2;13291:3;13232:67;:::i;:::-;13225:74;;13329:34;13325:1;13320:3;13316:11;13309:55;13395:26;13390:2;13385:3;13381:12;13374:48;13448:2;13443:3;13439:12;13432:19;;13215:242;;;:::o;13463:313::-;;13626:67;13690:2;13685:3;13626:67;:::i;:::-;13619:74;;13723:17;13719:1;13714:3;13710:11;13703:38;13767:2;13762:3;13758:12;13751:19;;13609:167;;;:::o;13782:374::-;;13945:67;14009:2;14004:3;13945:67;:::i;:::-;13938:74;;14042:34;14038:1;14033:3;14029:11;14022:55;14108:12;14103:2;14098:3;14094:12;14087:34;14147:2;14142:3;14138:12;14131:19;;13928:228;;;:::o;14162:373::-;;14325:67;14389:2;14384:3;14325:67;:::i;:::-;14318:74;;14422:34;14418:1;14413:3;14409:11;14402:55;14488:11;14483:2;14478:3;14474:12;14467:33;14526:2;14521:3;14517:12;14510:19;;14308:227;;;:::o;14541:325::-;;14704:67;14768:2;14763:3;14704:67;:::i;:::-;14697:74;;14801:29;14797:1;14792:3;14788:11;14781:50;14857:2;14852:3;14848:12;14841:19;;14687:179;;;:::o;14872:376::-;;15035:67;15099:2;15094:3;15035:67;:::i;:::-;15028:74;;15132:34;15128:1;15123:3;15119:11;15112:55;15198:14;15193:2;15188:3;15184:12;15177:36;15239:2;15234:3;15230:12;15223:19;;15018:230;;;:::o;15254:330::-;;15417:67;15481:2;15476:3;15417:67;:::i;:::-;15410:74;;15514:34;15510:1;15505:3;15501:11;15494:55;15575:2;15570:3;15566:12;15559:19;;15400:184;;;:::o;15590:376::-;;15753:67;15817:2;15812:3;15753:67;:::i;:::-;15746:74;;15850:34;15846:1;15841:3;15837:11;15830:55;15916:14;15911:2;15906:3;15902:12;15895:36;15957:2;15952:3;15948:12;15941:19;;15736:230;;;:::o;15972:330::-;;16135:67;16199:2;16194:3;16135:67;:::i;:::-;16128:74;;16232:34;16228:1;16223:3;16219:11;16212:55;16293:2;16288:3;16284:12;16277:19;;16118:184;;;:::o;16308:373::-;;16471:67;16535:2;16530:3;16471:67;:::i;:::-;16464:74;;16568:34;16564:1;16559:3;16555:11;16548:55;16634:11;16629:2;16624:3;16620:12;16613:33;16672:2;16667:3;16663:12;16656:19;;16454:227;;;:::o;16687:379::-;;16850:67;16914:2;16909:3;16850:67;:::i;:::-;16843:74;;16947:34;16943:1;16938:3;16934:11;16927:55;17013:17;17008:2;17003:3;16999:12;16992:39;17057:2;17052:3;17048:12;17041:19;;16833:233;;;:::o;17072:365::-;;17235:67;17299:2;17294:3;17235:67;:::i;:::-;17228:74;;17332:34;17328:1;17323:3;17319:11;17312:55;17398:3;17393:2;17388:3;17384:12;17377:25;17428:2;17423:3;17419:12;17412:19;;17218:219;;;:::o;17443:325::-;;17606:67;17670:2;17665:3;17606:67;:::i;:::-;17599:74;;17703:29;17699:1;17694:3;17690:11;17683:50;17759:2;17754:3;17750:12;17743:19;;17589:179;;;:::o;17774:320::-;;17937:67;18001:2;17996:3;17937:67;:::i;:::-;17930:74;;18034:24;18030:1;18025:3;18021:11;18014:45;18085:2;18080:3;18076:12;18069:19;;17920:174;;;:::o;18100:381::-;;18263:67;18327:2;18322:3;18263:67;:::i;:::-;18256:74;;18360:34;18356:1;18351:3;18347:11;18340:55;18426:19;18421:2;18416:3;18412:12;18405:41;18472:2;18467:3;18463:12;18456:19;;18246:235;;;:::o;18487:376::-;;18650:67;18714:2;18709:3;18650:67;:::i;:::-;18643:74;;18747:34;18743:1;18738:3;18734:11;18727:55;18813:14;18808:2;18803:3;18799:12;18792:36;18854:2;18849:3;18845:12;18838:19;;18633:230;;;:::o;18869:108::-;18946:24;18964:5;18946:24;:::i;:::-;18941:3;18934:37;18924:53;;:::o;18983:118::-;19070:24;19088:5;19070:24;:::i;:::-;19065:3;19058:37;19048:53;;:::o;19107:273::-;;19260:94;19350:3;19341:6;19260:94;:::i;:::-;19253:101;;19371:3;19364:10;;19242:138;;;;:::o;19386:435::-;;19588:95;19679:3;19670:6;19588:95;:::i;:::-;19581:102;;19700:95;19791:3;19782:6;19700:95;:::i;:::-;19693:102;;19812:3;19805:10;;19570:251;;;;;:::o;19827:222::-;;19958:2;19947:9;19943:18;19935:26;;19971:71;20039:1;20028:9;20024:17;20015:6;19971:71;:::i;:::-;19925:124;;;;:::o;20055:640::-;;20288:3;20277:9;20273:19;20265:27;;20302:71;20370:1;20359:9;20355:17;20346:6;20302:71;:::i;:::-;20383:72;20451:2;20440:9;20436:18;20427:6;20383:72;:::i;:::-;20465;20533:2;20522:9;20518:18;20509:6;20465:72;:::i;:::-;20584:9;20578:4;20574:20;20569:2;20558:9;20554:18;20547:48;20612:76;20683:4;20674:6;20612:76;:::i;:::-;20604:84;;20255:440;;;;;;;:::o;20701:373::-;;20882:2;20871:9;20867:18;20859:26;;20931:9;20925:4;20921:20;20917:1;20906:9;20902:17;20895:47;20959:108;21062:4;21053:6;20959:108;:::i;:::-;20951:116;;20849:225;;;;:::o;21080:210::-;;21205:2;21194:9;21190:18;21182:26;;21218:65;21280:1;21269:9;21265:17;21256:6;21218:65;:::i;:::-;21172:118;;;;:::o;21296:313::-;;21447:2;21436:9;21432:18;21424:26;;21496:9;21490:4;21486:20;21482:1;21471:9;21467:17;21460:47;21524:78;21597:4;21588:6;21524:78;:::i;:::-;21516:86;;21414:195;;;;:::o;21615:419::-;;21819:2;21808:9;21804:18;21796:26;;21868:9;21862:4;21858:20;21854:1;21843:9;21839:17;21832:47;21896:131;22022:4;21896:131;:::i;:::-;21888:139;;21786:248;;;:::o;22040:419::-;;22244:2;22233:9;22229:18;22221:26;;22293:9;22287:4;22283:20;22279:1;22268:9;22264:17;22257:47;22321:131;22447:4;22321:131;:::i;:::-;22313:139;;22211:248;;;:::o;22465:419::-;;22669:2;22658:9;22654:18;22646:26;;22718:9;22712:4;22708:20;22704:1;22693:9;22689:17;22682:47;22746:131;22872:4;22746:131;:::i;:::-;22738:139;;22636:248;;;:::o;22890:419::-;;23094:2;23083:9;23079:18;23071:26;;23143:9;23137:4;23133:20;23129:1;23118:9;23114:17;23107:47;23171:131;23297:4;23171:131;:::i;:::-;23163:139;;23061:248;;;:::o;23315:419::-;;23519:2;23508:9;23504:18;23496:26;;23568:9;23562:4;23558:20;23554:1;23543:9;23539:17;23532:47;23596:131;23722:4;23596:131;:::i;:::-;23588:139;;23486:248;;;:::o;23740:419::-;;23944:2;23933:9;23929:18;23921:26;;23993:9;23987:4;23983:20;23979:1;23968:9;23964:17;23957:47;24021:131;24147:4;24021:131;:::i;:::-;24013:139;;23911:248;;;:::o;24165:419::-;;24369:2;24358:9;24354:18;24346:26;;24418:9;24412:4;24408:20;24404:1;24393:9;24389:17;24382:47;24446:131;24572:4;24446:131;:::i;:::-;24438:139;;24336:248;;;:::o;24590:419::-;;24794:2;24783:9;24779:18;24771:26;;24843:9;24837:4;24833:20;24829:1;24818:9;24814:17;24807:47;24871:131;24997:4;24871:131;:::i;:::-;24863:139;;24761:248;;;:::o;25015:419::-;;25219:2;25208:9;25204:18;25196:26;;25268:9;25262:4;25258:20;25254:1;25243:9;25239:17;25232:47;25296:131;25422:4;25296:131;:::i;:::-;25288:139;;25186:248;;;:::o;25440:419::-;;25644:2;25633:9;25629:18;25621:26;;25693:9;25687:4;25683:20;25679:1;25668:9;25664:17;25657:47;25721:131;25847:4;25721:131;:::i;:::-;25713:139;;25611:248;;;:::o;25865:419::-;;26069:2;26058:9;26054:18;26046:26;;26118:9;26112:4;26108:20;26104:1;26093:9;26089:17;26082:47;26146:131;26272:4;26146:131;:::i;:::-;26138:139;;26036:248;;;:::o;26290:419::-;;26494:2;26483:9;26479:18;26471:26;;26543:9;26537:4;26533:20;26529:1;26518:9;26514:17;26507:47;26571:131;26697:4;26571:131;:::i;:::-;26563:139;;26461:248;;;:::o;26715:419::-;;26919:2;26908:9;26904:18;26896:26;;26968:9;26962:4;26958:20;26954:1;26943:9;26939:17;26932:47;26996:131;27122:4;26996:131;:::i;:::-;26988:139;;26886:248;;;:::o;27140:419::-;;27344:2;27333:9;27329:18;27321:26;;27393:9;27387:4;27383:20;27379:1;27368:9;27364:17;27357:47;27421:131;27547:4;27421:131;:::i;:::-;27413:139;;27311:248;;;:::o;27565:419::-;;27769:2;27758:9;27754:18;27746:26;;27818:9;27812:4;27808:20;27804:1;27793:9;27789:17;27782:47;27846:131;27972:4;27846:131;:::i;:::-;27838:139;;27736:248;;;:::o;27990:419::-;;28194:2;28183:9;28179:18;28171:26;;28243:9;28237:4;28233:20;28229:1;28218:9;28214:17;28207:47;28271:131;28397:4;28271:131;:::i;:::-;28263:139;;28161:248;;;:::o;28415:419::-;;28619:2;28608:9;28604:18;28596:26;;28668:9;28662:4;28658:20;28654:1;28643:9;28639:17;28632:47;28696:131;28822:4;28696:131;:::i;:::-;28688:139;;28586:248;;;:::o;28840:419::-;;29044:2;29033:9;29029:18;29021:26;;29093:9;29087:4;29083:20;29079:1;29068:9;29064:17;29057:47;29121:131;29247:4;29121:131;:::i;:::-;29113:139;;29011:248;;;:::o;29265:419::-;;29469:2;29458:9;29454:18;29446:26;;29518:9;29512:4;29508:20;29504:1;29493:9;29489:17;29482:47;29546:131;29672:4;29546:131;:::i;:::-;29538:139;;29436:248;;;:::o;29690:419::-;;29894:2;29883:9;29879:18;29871:26;;29943:9;29937:4;29933:20;29929:1;29918:9;29914:17;29907:47;29971:131;30097:4;29971:131;:::i;:::-;29963:139;;29861:248;;;:::o;30115:419::-;;30319:2;30308:9;30304:18;30296:26;;30368:9;30362:4;30358:20;30354:1;30343:9;30339:17;30332:47;30396:131;30522:4;30396:131;:::i;:::-;30388:139;;30286:248;;;:::o;30540:419::-;;30744:2;30733:9;30729:18;30721:26;;30793:9;30787:4;30783:20;30779:1;30768:9;30764:17;30757:47;30821:131;30947:4;30821:131;:::i;:::-;30813:139;;30711:248;;;:::o;30965:419::-;;31169:2;31158:9;31154:18;31146:26;;31218:9;31212:4;31208:20;31204:1;31193:9;31189:17;31182:47;31246:131;31372:4;31246:131;:::i;:::-;31238:139;;31136:248;;;:::o;31390:419::-;;31594:2;31583:9;31579:18;31571:26;;31643:9;31637:4;31633:20;31629:1;31618:9;31614:17;31607:47;31671:131;31797:4;31671:131;:::i;:::-;31663:139;;31561:248;;;:::o;31815:419::-;;32019:2;32008:9;32004:18;31996:26;;32068:9;32062:4;32058:20;32054:1;32043:9;32039:17;32032:47;32096:131;32222:4;32096:131;:::i;:::-;32088:139;;31986:248;;;:::o;32240:419::-;;32444:2;32433:9;32429:18;32421:26;;32493:9;32487:4;32483:20;32479:1;32468:9;32464:17;32457:47;32521:131;32647:4;32521:131;:::i;:::-;32513:139;;32411:248;;;:::o;32665:222::-;;32796:2;32785:9;32781:18;32773:26;;32809:71;32877:1;32866:9;32862:17;32853:6;32809:71;:::i;:::-;32763:124;;;;:::o;32893:283::-;;32959:2;32953:9;32943:19;;33001:4;32993:6;32989:17;33108:6;33096:10;33093:22;33072:18;33060:10;33057:34;33054:62;33051:2;;;33119:18;;:::i;:::-;33051:2;33159:10;33155:2;33148:22;32933:243;;;;:::o;33182:331::-;;33333:18;33325:6;33322:30;33319:2;;;33355:18;;:::i;:::-;33319:2;33440:4;33436:9;33429:4;33421:6;33417:17;33413:33;33405:41;;33501:4;33495;33491:15;33483:23;;33248:265;;;:::o;33519:332::-;;33671:18;33663:6;33660:30;33657:2;;;33693:18;;:::i;:::-;33657:2;33778:4;33774:9;33767:4;33759:6;33755:17;33751:33;33743:41;;33839:4;33833;33829:15;33821:23;;33586:265;;;:::o;33857:132::-;;33947:3;33939:11;;33977:4;33972:3;33968:14;33960:22;;33929:60;;;:::o;33995:144::-;;34070:3;34062:11;;34093:3;34090:1;34083:14;34127:4;34124:1;34114:18;34106:26;;34052:87;;;:::o;34145:114::-;;34246:5;34240:12;34230:22;;34219:40;;;:::o;34265:98::-;;34350:5;34344:12;34334:22;;34323:40;;;:::o;34369:99::-;;34455:5;34449:12;34439:22;;34428:40;;;:::o;34474:113::-;;34576:4;34571:3;34567:14;34559:22;;34549:38;;;:::o;34593:184::-;;34726:6;34721:3;34714:19;34766:4;34761:3;34757:14;34742:29;;34704:73;;;;:::o;34783:168::-;;34900:6;34895:3;34888:19;34940:4;34935:3;34931:14;34916:29;;34878:73;;;;:::o;34957:147::-;;35095:3;35080:18;;35070:34;;;;:::o;35110:169::-;;35228:6;35223:3;35216:19;35268:4;35263:3;35259:14;35244:29;;35206:73;;;;:::o;35285:148::-;;35424:3;35409:18;;35399:34;;;;:::o;35439:305::-;;35498:20;35516:1;35498:20;:::i;:::-;35493:25;;35532:20;35550:1;35532:20;:::i;:::-;35527:25;;35686:1;35618:66;35614:74;35611:1;35608:81;35605:2;;;35692:18;;:::i;:::-;35605:2;35736:1;35733;35729:9;35722:16;;35483:261;;;;:::o;35750:185::-;;35807:20;35825:1;35807:20;:::i;:::-;35802:25;;35841:20;35859:1;35841:20;:::i;:::-;35836:25;;35880:1;35870:2;;35885:18;;:::i;:::-;35870:2;35927:1;35924;35920:9;35915:14;;35792:143;;;;:::o;35941:191::-;;36001:20;36019:1;36001:20;:::i;:::-;35996:25;;36035:20;36053:1;36035:20;:::i;:::-;36030:25;;36074:1;36071;36068:8;36065:2;;;36079:18;;:::i;:::-;36065:2;36124:1;36121;36117:9;36109:17;;35986:146;;;;:::o;36138:96::-;;36204:24;36222:5;36204:24;:::i;:::-;36193:35;;36183:51;;;:::o;36240:90::-;;36317:5;36310:13;36303:21;36292:32;;36282:48;;;:::o;36336:149::-;;36412:66;36405:5;36401:78;36390:89;;36380:105;;;:::o;36491:126::-;;36568:42;36561:5;36557:54;36546:65;;36536:81;;;:::o;36623:77::-;;36689:5;36678:16;;36668:32;;;:::o;36706:154::-;36790:6;36785:3;36780;36767:30;36852:1;36843:6;36838:3;36834:16;36827:27;36757:103;;;:::o;36866:307::-;36934:1;36944:113;36958:6;36955:1;36952:13;36944:113;;;37043:1;37038:3;37034:11;37028:18;37024:1;37019:3;37015:11;37008:39;36980:2;36977:1;36973:10;36968:15;;36944:113;;;37075:6;37072:1;37069:13;37066:2;;;37155:1;37146:6;37141:3;37137:16;37130:27;37066:2;36915:258;;;;:::o;37179:320::-;;37260:1;37254:4;37250:12;37240:22;;37307:1;37301:4;37297:12;37328:18;37318:2;;37384:4;37376:6;37372:17;37362:27;;37318:2;37446;37438:6;37435:14;37415:18;37412:38;37409:2;;;37465:18;;:::i;:::-;37409:2;37230:269;;;;:::o;37505:233::-;;37567:24;37585:5;37567:24;:::i;:::-;37558:33;;37613:66;37606:5;37603:77;37600:2;;;37683:18;;:::i;:::-;37600:2;37730:1;37723:5;37719:13;37712:20;;37548:190;;;:::o;37744:176::-;;37793:20;37811:1;37793:20;:::i;:::-;37788:25;;37827:20;37845:1;37827:20;:::i;:::-;37822:25;;37866:1;37856:2;;37871:18;;:::i;:::-;37856:2;37912:1;37909;37905:9;37900:14;;37778:142;;;;:::o;37926:180::-;37974:77;37971:1;37964:88;38071:4;38068:1;38061:15;38095:4;38092:1;38085:15;38112:180;38160:77;38157:1;38150:88;38257:4;38254:1;38247:15;38281:4;38278:1;38271:15;38298:180;38346:77;38343:1;38336:88;38443:4;38440:1;38433:15;38467:4;38464:1;38457:15;38484:180;38532:77;38529:1;38522:88;38629:4;38626:1;38619:15;38653:4;38650:1;38643:15;38670:102;;38762:2;38758:7;38753:2;38746:5;38742:14;38738:28;38728:38;;38718:54;;;:::o;38778:122::-;38851:24;38869:5;38851:24;:::i;:::-;38844:5;38841:35;38831:2;;38890:1;38887;38880:12;38831:2;38821:79;:::o;38906:116::-;38976:21;38991:5;38976:21;:::i;:::-;38969:5;38966:32;38956:2;;39012:1;39009;39002:12;38956:2;38946:76;:::o;39028:120::-;39100:23;39117:5;39100:23;:::i;:::-;39093:5;39090:34;39080:2;;39138:1;39135;39128:12;39080:2;39070:78;:::o;39154:122::-;39227:24;39245:5;39227:24;:::i;:::-;39220:5;39217:35;39207:2;;39266:1;39263;39256:12;39207:2;39197:79;:::o

Swarm Source

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