ERC-721
Overview
Max Total Supply
641 Colors
Holders
359
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 ColorsLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ColorNFT
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-11-13 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } 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); } } pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; string public _baseURI; /** * @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 base = baseURI(); return bytes(base).length > 0 ? string(abi.encodePacked(base, 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 _baseURI; } /** * @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(to).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 {} } pragma solidity ^0.8.0; /** * @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(); } } pragma solidity ^0.8.0; contract ColorNFT is ERC721Enumerable, Ownable { using SafeMath for uint256; using Address for address; using Strings for uint256; uint public constant _TOTALSUPPLY = 10000; uint256 public price = 90000000000000000; // 0.09 ETH uint256 WHITE_LIST_DISCOUNT = 30; bool public isPaused = true; mapping(address => bool) discounters; constructor(string memory baseURI) ERC721("Color NFT by Color Museum", "Colors") { setBaseURI(baseURI); } function mint(address _to, uint256 _tokenId) public payable isSaleOpen{ require(isPaused == false, "Sale is not active at the moment"); require(_to != address(0), "Mint to the zero address"); bool isDiscountUser = discounters[_to]; uint256 value; if(isDiscountUser) { value = price.mul(100 - WHITE_LIST_DISCOUNT).div(100); } else { value = price; } require(value <= msg.value, "wrong amount sent"); _safeMint(_to, _tokenId); if(!isDiscountUser) { discounters[_to] = true; } } function setBaseURI(string memory baseURI) public onlyOwner { _baseURI = baseURI; } function flipPauseStatus() public onlyOwner { isPaused = !isPaused; } function setPrice(uint256 _newPrice) public onlyOwner() { price = _newPrice; } function setWhiteListDiscount(uint256 _discount) public onlyOwner { WHITE_LIST_DISCOUNT = _discount; } function setWhiteList(address user) public onlyOwner { discounters[user] = true; } function removeWhiteList(address user) public onlyOwner { discounters[user] = false; } function isWhiteList(address user) public view returns (bool) { return discounters[user]; } modifier isSaleOpen{ require(totalSupply() < _TOTALSUPPLY, "Mint woud exceed totalSupply"); _; } function tokensOfOwner(address _owner) public view returns (uint256[] memory) { uint256 count = balanceOf(_owner); uint256[] memory result = new uint256[](count); for (uint256 index = 0; index < count; index++) { result[index] = tokenOfOwnerByIndex(_owner, index); } return result; } function withdraw() public onlyOwner { uint balance = address(this).balance; payable(msg.sender).transfer(balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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":"_TOTALSUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipPauseStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"isWhiteList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"removeWhiteList","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":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"setWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_discount","type":"uint256"}],"name":"setWhiteListDiscount","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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405267013fbe85edc90000600c55601e600d556001600e60006101000a81548160ff0219169083151502179055503480156200003d57600080fd5b5060405162004b2438038062004b248339818101604052810190620000639190620004f6565b6040518060400160405280601981526020017f436f6c6f72204e465420627920436f6c6f72204d757365756d000000000000008152506040518060400160405280600681526020017f436f6c6f727300000000000000000000000000000000000000000000000000008152508160009080519060200190620000e7929190620002a9565b50806001908051906020019062000100929190620002a9565b505050600062000115620001cc60201b60201c565b905080600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620001c581620001d460201b60201c565b506200062f565b600033905090565b620001e4620001cc60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200020a6200027f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000263576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200025a90620005a8565b60405180910390fd5b80600690805190602001906200027b929190620002a9565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620002b790620005f9565b90600052602060002090601f016020900481019282620002db576000855562000327565b82601f10620002f657805160ff191683800117855562000327565b8280016001018555821562000327579182015b828111156200032657825182559160200191906001019062000309565b5b5090506200033691906200033a565b5090565b5b80821115620003555760008160009055506001016200033b565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620003c28262000377565b810181811067ffffffffffffffff82111715620003e457620003e362000388565b5b80604052505050565b6000620003f962000359565b9050620004078282620003b7565b919050565b600067ffffffffffffffff8211156200042a576200042962000388565b5b620004358262000377565b9050602081019050919050565b60005b838110156200046257808201518184015260208101905062000445565b8381111562000472576000848401525b50505050565b60006200048f62000489846200040c565b620003ed565b905082815260208101848484011115620004ae57620004ad62000372565b5b620004bb84828562000442565b509392505050565b600082601f830112620004db57620004da6200036d565b5b8151620004ed84826020860162000478565b91505092915050565b6000602082840312156200050f576200050e62000363565b5b600082015167ffffffffffffffff81111562000530576200052f62000368565b5b6200053e84828501620004c3565b91505092915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200059060208362000547565b91506200059d8262000558565b602082019050919050565b60006020820190508181036000830152620005c38162000581565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200061257607f821691505b60208210811415620006295762000628620005ca565b5b50919050565b6144e5806200063f6000396000f3fe6080604052600436106101ee5760003560e01c8063715018a61161010d578063b187bd26116100a0578063e44c8fe31161006f578063e44c8fe3146106ee578063e985e9c514610717578063f2fde38b14610754578063f99031a71461077d578063fa62884c146107ba576101ee565b8063b187bd2614610632578063b88d4fde1461065d578063c87b56dd14610686578063db4568e2146106c3576101ee565b806391b7f5ed116100dc57806391b7f5ed1461058a57806395d89b41146105b3578063a035b1fe146105de578063a22cb46514610609576101ee565b8063715018a6146104e0578063743976a0146104f75780638462151c146105225780638da5cb5b1461055f576101ee565b806339e899ee116101855780634f6ccce7116101545780634f6ccce71461040057806355f804b31461043d5780636352211e1461046657806370a08231146104a3576101ee565b806339e899ee1461037b5780633ccfd60b146103a457806340c10f19146103bb57806342842e0e146103d7576101ee565b806318160ddd116101c157806318160ddd146102c15780632042e5c2146102ec57806323b872dd146103155780632f745c591461033e576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190612e43565b6107d1565b6040516102279190612e8b565b60405180910390f35b34801561023c57600080fd5b5061024561084b565b6040516102529190612f3f565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190612f97565b6108dd565b60405161028f9190613005565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba919061304c565b610962565b005b3480156102cd57600080fd5b506102d6610a7a565b6040516102e3919061309b565b60405180910390f35b3480156102f857600080fd5b50610313600480360381019061030e91906130b6565b610a87565b005b34801561032157600080fd5b5061033c600480360381019061033791906130e3565b610b5e565b005b34801561034a57600080fd5b506103656004803603810190610360919061304c565b610bbe565b604051610372919061309b565b60405180910390f35b34801561038757600080fd5b506103a2600480360381019061039d91906130b6565b610c63565b005b3480156103b057600080fd5b506103b9610d3a565b005b6103d560048036038101906103d0919061304c565b610e05565b005b3480156103e357600080fd5b506103fe60048036038101906103f991906130e3565b611063565b005b34801561040c57600080fd5b5061042760048036038101906104229190612f97565b611083565b604051610434919061309b565b60405180910390f35b34801561044957600080fd5b50610464600480360381019061045f919061326b565b6110f4565b005b34801561047257600080fd5b5061048d60048036038101906104889190612f97565b61118a565b60405161049a9190613005565b60405180910390f35b3480156104af57600080fd5b506104ca60048036038101906104c591906130b6565b61123c565b6040516104d7919061309b565b60405180910390f35b3480156104ec57600080fd5b506104f56112f4565b005b34801561050357600080fd5b5061050c6113f9565b6040516105199190612f3f565b60405180910390f35b34801561052e57600080fd5b50610549600480360381019061054491906130b6565b611487565b6040516105569190613372565b60405180910390f35b34801561056b57600080fd5b50610574611535565b6040516105819190613005565b60405180910390f35b34801561059657600080fd5b506105b160048036038101906105ac9190612f97565b61155f565b005b3480156105bf57600080fd5b506105c86115e5565b6040516105d59190612f3f565b60405180910390f35b3480156105ea57600080fd5b506105f3611677565b604051610600919061309b565b60405180910390f35b34801561061557600080fd5b50610630600480360381019061062b91906133c0565b61167d565b005b34801561063e57600080fd5b506106476117fe565b6040516106549190612e8b565b60405180910390f35b34801561066957600080fd5b50610684600480360381019061067f91906134a1565b611811565b005b34801561069257600080fd5b506106ad60048036038101906106a89190612f97565b611873565b6040516106ba9190612f3f565b60405180910390f35b3480156106cf57600080fd5b506106d861191a565b6040516106e5919061309b565b60405180910390f35b3480156106fa57600080fd5b5061071560048036038101906107109190612f97565b611920565b005b34801561072357600080fd5b5061073e60048036038101906107399190613524565b6119a6565b60405161074b9190612e8b565b60405180910390f35b34801561076057600080fd5b5061077b600480360381019061077691906130b6565b611a3a565b005b34801561078957600080fd5b506107a4600480360381019061079f91906130b6565b611b32565b6040516107b19190612e8b565b60405180910390f35b3480156107c657600080fd5b506107cf611b88565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610844575061084382611c30565b5b9050919050565b60606000805461085a90613593565b80601f016020809104026020016040519081016040528092919081815260200182805461088690613593565b80156108d35780601f106108a8576101008083540402835291602001916108d3565b820191906000526020600020905b8154815290600101906020018083116108b657829003601f168201915b5050505050905090565b60006108e882611d12565b610927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091e90613637565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061096d8261118a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d5906136c9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109fd611d7e565b73ffffffffffffffffffffffffffffffffffffffff161480610a2c5750610a2b81610a26611d7e565b6119a6565b5b610a6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a629061375b565b60405180910390fd5b610a758383611d86565b505050565b6000600980549050905090565b610a8f611d7e565b73ffffffffffffffffffffffffffffffffffffffff16610aad611535565b73ffffffffffffffffffffffffffffffffffffffff1614610b03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610afa906137c7565b60405180910390fd5b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b610b6f610b69611d7e565b82611e3f565b610bae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba590613859565b60405180910390fd5b610bb9838383611f1d565b505050565b6000610bc98361123c565b8210610c0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c01906138eb565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610c6b611d7e565b73ffffffffffffffffffffffffffffffffffffffff16610c89611535565b73ffffffffffffffffffffffffffffffffffffffff1614610cdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd6906137c7565b60405180910390fd5b6001600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b610d42611d7e565b73ffffffffffffffffffffffffffffffffffffffff16610d60611535565b73ffffffffffffffffffffffffffffffffffffffff1614610db6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dad906137c7565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610e01573d6000803e3d6000fd5b5050565b612710610e10610a7a565b10610e50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4790613957565b60405180910390fd5b60001515600e60009054906101000a900460ff16151514610ea6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9d906139c3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0d90613a2f565b60405180910390fd5b6000600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905060008115610fac57610fa56064610f97600d546064610f869190613a7e565b600c5461217990919063ffffffff16565b61218f90919063ffffffff16565b9050610fb2565b600c5490505b34811115610ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fec90613afe565b60405180910390fd5b610fff84846121a5565b8161105d576001600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b50505050565b61107e83838360405180602001604052806000815250611811565b505050565b600061108d610a7a565b82106110ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c590613b90565b60405180910390fd5b600982815481106110e2576110e1613bb0565b5b90600052602060002001549050919050565b6110fc611d7e565b73ffffffffffffffffffffffffffffffffffffffff1661111a611535565b73ffffffffffffffffffffffffffffffffffffffff1614611170576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611167906137c7565b60405180910390fd5b8060069080519060200190611186929190612d34565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611233576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122a90613c51565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a490613ce3565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112fc611d7e565b73ffffffffffffffffffffffffffffffffffffffff1661131a611535565b73ffffffffffffffffffffffffffffffffffffffff1614611370576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611367906137c7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36113f760006121c3565b565b6006805461140690613593565b80601f016020809104026020016040519081016040528092919081815260200182805461143290613593565b801561147f5780601f106114545761010080835404028352916020019161147f565b820191906000526020600020905b81548152906001019060200180831161146257829003601f168201915b505050505081565b606060006114948361123c565b905060008167ffffffffffffffff8111156114b2576114b1613140565b5b6040519080825280602002602001820160405280156114e05781602001602082028036833780820191505090505b50905060005b8281101561152a576114f88582610bbe565b82828151811061150b5761150a613bb0565b5b602002602001018181525050808061152290613d03565b9150506114e6565b508092505050919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611567611d7e565b73ffffffffffffffffffffffffffffffffffffffff16611585611535565b73ffffffffffffffffffffffffffffffffffffffff16146115db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d2906137c7565b60405180910390fd5b80600c8190555050565b6060600180546115f490613593565b80601f016020809104026020016040519081016040528092919081815260200182805461162090613593565b801561166d5780601f106116425761010080835404028352916020019161166d565b820191906000526020600020905b81548152906001019060200180831161165057829003601f168201915b5050505050905090565b600c5481565b611685611d7e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ea90613d98565b60405180910390fd5b8060056000611700611d7e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117ad611d7e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117f29190612e8b565b60405180910390a35050565b600e60009054906101000a900460ff1681565b61182261181c611d7e565b83611e3f565b611861576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185890613859565b60405180910390fd5b61186d84848484612289565b50505050565b606061187e82611d12565b6118bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b490613e2a565b60405180910390fd5b60006118c76122e5565b905060008151116118e75760405180602001604052806000815250611912565b806118f184612377565b604051602001611902929190613e86565b6040516020818303038152906040525b915050919050565b61271081565b611928611d7e565b73ffffffffffffffffffffffffffffffffffffffff16611946611535565b73ffffffffffffffffffffffffffffffffffffffff161461199c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611993906137c7565b60405180910390fd5b80600d8190555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a42611d7e565b73ffffffffffffffffffffffffffffffffffffffff16611a60611535565b73ffffffffffffffffffffffffffffffffffffffff1614611ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aad906137c7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1d90613f1c565b60405180910390fd5b611b2f816121c3565b50565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b611b90611d7e565b73ffffffffffffffffffffffffffffffffffffffff16611bae611535565b73ffffffffffffffffffffffffffffffffffffffff1614611c04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfb906137c7565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611cfb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611d0b5750611d0a826124d8565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611df98361118a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611e4a82611d12565b611e89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8090613fae565b60405180910390fd5b6000611e948361118a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f0357508373ffffffffffffffffffffffffffffffffffffffff16611eeb846108dd565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f145750611f1381856119a6565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f3d8261118a565b73ffffffffffffffffffffffffffffffffffffffff1614611f93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8a90614040565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612003576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffa906140d2565b60405180910390fd5b61200e838383612542565b612019600082611d86565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120699190613a7e565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120c091906140f2565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600081836121879190614148565b905092915050565b6000818361219d91906141d1565b905092915050565b6121bf828260405180602001604052806000815250612656565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612294848484611f1d565b6122a0848484846126b1565b6122df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d690614274565b60405180910390fd5b50505050565b6060600680546122f490613593565b80601f016020809104026020016040519081016040528092919081815260200182805461232090613593565b801561236d5780601f106123425761010080835404028352916020019161236d565b820191906000526020600020905b81548152906001019060200180831161235057829003601f168201915b5050505050905090565b606060008214156123bf576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506124d3565b600082905060005b600082146123f15780806123da90613d03565b915050600a826123ea91906141d1565b91506123c7565b60008167ffffffffffffffff81111561240d5761240c613140565b5b6040519080825280601f01601f19166020018201604052801561243f5781602001600182028036833780820191505090505b5090505b600085146124cc576001826124589190613a7e565b9150600a856124679190614294565b603061247391906140f2565b60f81b81838151811061248957612488613bb0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856124c591906141d1565b9450612443565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61254d838383612848565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125905761258b8161284d565b6125cf565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146125ce576125cd8382612896565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126125761260d81612a03565b612651565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146126505761264f8282612ad4565b5b5b505050565b6126608383612b53565b61266d60008484846126b1565b6126ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a390614274565b60405180910390fd5b505050565b60006126d28473ffffffffffffffffffffffffffffffffffffffff16612d21565b1561283b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126fb611d7e565b8786866040518563ffffffff1660e01b815260040161271d949392919061431a565b602060405180830381600087803b15801561273757600080fd5b505af192505050801561276857506040513d601f19601f82011682018060405250810190612765919061437b565b60015b6127eb573d8060008114612798576040519150601f19603f3d011682016040523d82523d6000602084013e61279d565b606091505b506000815114156127e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127da90614274565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612840565b600190505b949350505050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016128a38461123c565b6128ad9190613a7e565b9050600060086000848152602001908152602001600020549050818114612992576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600980549050612a179190613a7e565b90506000600a6000848152602001908152602001600020549050600060098381548110612a4757612a46613bb0565b5b906000526020600020015490508060098381548110612a6957612a68613bb0565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a6000858152602001908152602001600020600090556009805480612ab857612ab76143a8565b5b6001900381819060005260206000200160009055905550505050565b6000612adf8361123c565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bba90614423565b60405180910390fd5b612bcc81611d12565b15612c0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c039061448f565b60405180910390fd5b612c1860008383612542565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c6891906140f2565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612d4090613593565b90600052602060002090601f016020900481019282612d625760008555612da9565b82601f10612d7b57805160ff1916838001178555612da9565b82800160010185558215612da9579182015b82811115612da8578251825591602001919060010190612d8d565b5b509050612db69190612dba565b5090565b5b80821115612dd3576000816000905550600101612dbb565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612e2081612deb565b8114612e2b57600080fd5b50565b600081359050612e3d81612e17565b92915050565b600060208284031215612e5957612e58612de1565b5b6000612e6784828501612e2e565b91505092915050565b60008115159050919050565b612e8581612e70565b82525050565b6000602082019050612ea06000830184612e7c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612ee0578082015181840152602081019050612ec5565b83811115612eef576000848401525b50505050565b6000601f19601f8301169050919050565b6000612f1182612ea6565b612f1b8185612eb1565b9350612f2b818560208601612ec2565b612f3481612ef5565b840191505092915050565b60006020820190508181036000830152612f598184612f06565b905092915050565b6000819050919050565b612f7481612f61565b8114612f7f57600080fd5b50565b600081359050612f9181612f6b565b92915050565b600060208284031215612fad57612fac612de1565b5b6000612fbb84828501612f82565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612fef82612fc4565b9050919050565b612fff81612fe4565b82525050565b600060208201905061301a6000830184612ff6565b92915050565b61302981612fe4565b811461303457600080fd5b50565b60008135905061304681613020565b92915050565b6000806040838503121561306357613062612de1565b5b600061307185828601613037565b925050602061308285828601612f82565b9150509250929050565b61309581612f61565b82525050565b60006020820190506130b0600083018461308c565b92915050565b6000602082840312156130cc576130cb612de1565b5b60006130da84828501613037565b91505092915050565b6000806000606084860312156130fc576130fb612de1565b5b600061310a86828701613037565b935050602061311b86828701613037565b925050604061312c86828701612f82565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61317882612ef5565b810181811067ffffffffffffffff8211171561319757613196613140565b5b80604052505050565b60006131aa612dd7565b90506131b6828261316f565b919050565b600067ffffffffffffffff8211156131d6576131d5613140565b5b6131df82612ef5565b9050602081019050919050565b82818337600083830152505050565b600061320e613209846131bb565b6131a0565b90508281526020810184848401111561322a5761322961313b565b5b6132358482856131ec565b509392505050565b600082601f83011261325257613251613136565b5b81356132628482602086016131fb565b91505092915050565b60006020828403121561328157613280612de1565b5b600082013567ffffffffffffffff81111561329f5761329e612de6565b5b6132ab8482850161323d565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6132e981612f61565b82525050565b60006132fb83836132e0565b60208301905092915050565b6000602082019050919050565b600061331f826132b4565b61332981856132bf565b9350613334836132d0565b8060005b8381101561336557815161334c88826132ef565b975061335783613307565b925050600181019050613338565b5085935050505092915050565b6000602082019050818103600083015261338c8184613314565b905092915050565b61339d81612e70565b81146133a857600080fd5b50565b6000813590506133ba81613394565b92915050565b600080604083850312156133d7576133d6612de1565b5b60006133e585828601613037565b92505060206133f6858286016133ab565b9150509250929050565b600067ffffffffffffffff82111561341b5761341a613140565b5b61342482612ef5565b9050602081019050919050565b600061344461343f84613400565b6131a0565b9050828152602081018484840111156134605761345f61313b565b5b61346b8482856131ec565b509392505050565b600082601f83011261348857613487613136565b5b8135613498848260208601613431565b91505092915050565b600080600080608085870312156134bb576134ba612de1565b5b60006134c987828801613037565b94505060206134da87828801613037565b93505060406134eb87828801612f82565b925050606085013567ffffffffffffffff81111561350c5761350b612de6565b5b61351887828801613473565b91505092959194509250565b6000806040838503121561353b5761353a612de1565b5b600061354985828601613037565b925050602061355a85828601613037565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806135ab57607f821691505b602082108114156135bf576135be613564565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613621602c83612eb1565b915061362c826135c5565b604082019050919050565b6000602082019050818103600083015261365081613614565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006136b3602183612eb1565b91506136be82613657565b604082019050919050565b600060208201905081810360008301526136e2816136a6565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613745603883612eb1565b9150613750826136e9565b604082019050919050565b6000602082019050818103600083015261377481613738565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006137b1602083612eb1565b91506137bc8261377b565b602082019050919050565b600060208201905081810360008301526137e0816137a4565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613843603183612eb1565b915061384e826137e7565b604082019050919050565b6000602082019050818103600083015261387281613836565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006138d5602b83612eb1565b91506138e082613879565b604082019050919050565b60006020820190508181036000830152613904816138c8565b9050919050565b7f4d696e7420776f75642065786365656420746f74616c537570706c7900000000600082015250565b6000613941601c83612eb1565b915061394c8261390b565b602082019050919050565b6000602082019050818103600083015261397081613934565b9050919050565b7f53616c65206973206e6f742061637469766520617420746865206d6f6d656e74600082015250565b60006139ad602083612eb1565b91506139b882613977565b602082019050919050565b600060208201905081810360008301526139dc816139a0565b9050919050565b7f4d696e7420746f20746865207a65726f20616464726573730000000000000000600082015250565b6000613a19601883612eb1565b9150613a24826139e3565b602082019050919050565b60006020820190508181036000830152613a4881613a0c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a8982612f61565b9150613a9483612f61565b925082821015613aa757613aa6613a4f565b5b828203905092915050565b7f77726f6e6720616d6f756e742073656e74000000000000000000000000000000600082015250565b6000613ae8601183612eb1565b9150613af382613ab2565b602082019050919050565b60006020820190508181036000830152613b1781613adb565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613b7a602c83612eb1565b9150613b8582613b1e565b604082019050919050565b60006020820190508181036000830152613ba981613b6d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613c3b602983612eb1565b9150613c4682613bdf565b604082019050919050565b60006020820190508181036000830152613c6a81613c2e565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613ccd602a83612eb1565b9150613cd882613c71565b604082019050919050565b60006020820190508181036000830152613cfc81613cc0565b9050919050565b6000613d0e82612f61565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d4157613d40613a4f565b5b600182019050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613d82601983612eb1565b9150613d8d82613d4c565b602082019050919050565b60006020820190508181036000830152613db181613d75565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613e14602f83612eb1565b9150613e1f82613db8565b604082019050919050565b60006020820190508181036000830152613e4381613e07565b9050919050565b600081905092915050565b6000613e6082612ea6565b613e6a8185613e4a565b9350613e7a818560208601612ec2565b80840191505092915050565b6000613e928285613e55565b9150613e9e8284613e55565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613f06602683612eb1565b9150613f1182613eaa565b604082019050919050565b60006020820190508181036000830152613f3581613ef9565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613f98602c83612eb1565b9150613fa382613f3c565b604082019050919050565b60006020820190508181036000830152613fc781613f8b565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b600061402a602983612eb1565b915061403582613fce565b604082019050919050565b600060208201905081810360008301526140598161401d565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006140bc602483612eb1565b91506140c782614060565b604082019050919050565b600060208201905081810360008301526140eb816140af565b9050919050565b60006140fd82612f61565b915061410883612f61565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561413d5761413c613a4f565b5b828201905092915050565b600061415382612f61565b915061415e83612f61565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561419757614196613a4f565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006141dc82612f61565b91506141e783612f61565b9250826141f7576141f66141a2565b5b828204905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061425e603283612eb1565b915061426982614202565b604082019050919050565b6000602082019050818103600083015261428d81614251565b9050919050565b600061429f82612f61565b91506142aa83612f61565b9250826142ba576142b96141a2565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006142ec826142c5565b6142f681856142d0565b9350614306818560208601612ec2565b61430f81612ef5565b840191505092915050565b600060808201905061432f6000830187612ff6565b61433c6020830186612ff6565b614349604083018561308c565b818103606083015261435b81846142e1565b905095945050505050565b60008151905061437581612e17565b92915050565b60006020828403121561439157614390612de1565b5b600061439f84828501614366565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061440d602083612eb1565b9150614418826143d7565b602082019050919050565b6000602082019050818103600083015261443c81614400565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614479601c83612eb1565b915061448482614443565b602082019050919050565b600060208201905081810360008301526144a88161446c565b905091905056fea26469706673582212204dce50d143bcdc1effbd36ef8fe16f36ff775cf2b41d45f909b9fcb84ffe400664736f6c634300080900330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003568747470733a2f2f6d657461646174612e636f6c6f722e6d757365756d2f6170692f76312f696d6167652f6765742d696d6167652f0000000000000000000000
Deployed Bytecode
0x6080604052600436106101ee5760003560e01c8063715018a61161010d578063b187bd26116100a0578063e44c8fe31161006f578063e44c8fe3146106ee578063e985e9c514610717578063f2fde38b14610754578063f99031a71461077d578063fa62884c146107ba576101ee565b8063b187bd2614610632578063b88d4fde1461065d578063c87b56dd14610686578063db4568e2146106c3576101ee565b806391b7f5ed116100dc57806391b7f5ed1461058a57806395d89b41146105b3578063a035b1fe146105de578063a22cb46514610609576101ee565b8063715018a6146104e0578063743976a0146104f75780638462151c146105225780638da5cb5b1461055f576101ee565b806339e899ee116101855780634f6ccce7116101545780634f6ccce71461040057806355f804b31461043d5780636352211e1461046657806370a08231146104a3576101ee565b806339e899ee1461037b5780633ccfd60b146103a457806340c10f19146103bb57806342842e0e146103d7576101ee565b806318160ddd116101c157806318160ddd146102c15780632042e5c2146102ec57806323b872dd146103155780632f745c591461033e576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190612e43565b6107d1565b6040516102279190612e8b565b60405180910390f35b34801561023c57600080fd5b5061024561084b565b6040516102529190612f3f565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190612f97565b6108dd565b60405161028f9190613005565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba919061304c565b610962565b005b3480156102cd57600080fd5b506102d6610a7a565b6040516102e3919061309b565b60405180910390f35b3480156102f857600080fd5b50610313600480360381019061030e91906130b6565b610a87565b005b34801561032157600080fd5b5061033c600480360381019061033791906130e3565b610b5e565b005b34801561034a57600080fd5b506103656004803603810190610360919061304c565b610bbe565b604051610372919061309b565b60405180910390f35b34801561038757600080fd5b506103a2600480360381019061039d91906130b6565b610c63565b005b3480156103b057600080fd5b506103b9610d3a565b005b6103d560048036038101906103d0919061304c565b610e05565b005b3480156103e357600080fd5b506103fe60048036038101906103f991906130e3565b611063565b005b34801561040c57600080fd5b5061042760048036038101906104229190612f97565b611083565b604051610434919061309b565b60405180910390f35b34801561044957600080fd5b50610464600480360381019061045f919061326b565b6110f4565b005b34801561047257600080fd5b5061048d60048036038101906104889190612f97565b61118a565b60405161049a9190613005565b60405180910390f35b3480156104af57600080fd5b506104ca60048036038101906104c591906130b6565b61123c565b6040516104d7919061309b565b60405180910390f35b3480156104ec57600080fd5b506104f56112f4565b005b34801561050357600080fd5b5061050c6113f9565b6040516105199190612f3f565b60405180910390f35b34801561052e57600080fd5b50610549600480360381019061054491906130b6565b611487565b6040516105569190613372565b60405180910390f35b34801561056b57600080fd5b50610574611535565b6040516105819190613005565b60405180910390f35b34801561059657600080fd5b506105b160048036038101906105ac9190612f97565b61155f565b005b3480156105bf57600080fd5b506105c86115e5565b6040516105d59190612f3f565b60405180910390f35b3480156105ea57600080fd5b506105f3611677565b604051610600919061309b565b60405180910390f35b34801561061557600080fd5b50610630600480360381019061062b91906133c0565b61167d565b005b34801561063e57600080fd5b506106476117fe565b6040516106549190612e8b565b60405180910390f35b34801561066957600080fd5b50610684600480360381019061067f91906134a1565b611811565b005b34801561069257600080fd5b506106ad60048036038101906106a89190612f97565b611873565b6040516106ba9190612f3f565b60405180910390f35b3480156106cf57600080fd5b506106d861191a565b6040516106e5919061309b565b60405180910390f35b3480156106fa57600080fd5b5061071560048036038101906107109190612f97565b611920565b005b34801561072357600080fd5b5061073e60048036038101906107399190613524565b6119a6565b60405161074b9190612e8b565b60405180910390f35b34801561076057600080fd5b5061077b600480360381019061077691906130b6565b611a3a565b005b34801561078957600080fd5b506107a4600480360381019061079f91906130b6565b611b32565b6040516107b19190612e8b565b60405180910390f35b3480156107c657600080fd5b506107cf611b88565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610844575061084382611c30565b5b9050919050565b60606000805461085a90613593565b80601f016020809104026020016040519081016040528092919081815260200182805461088690613593565b80156108d35780601f106108a8576101008083540402835291602001916108d3565b820191906000526020600020905b8154815290600101906020018083116108b657829003601f168201915b5050505050905090565b60006108e882611d12565b610927576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091e90613637565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061096d8261118a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d5906136c9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109fd611d7e565b73ffffffffffffffffffffffffffffffffffffffff161480610a2c5750610a2b81610a26611d7e565b6119a6565b5b610a6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a629061375b565b60405180910390fd5b610a758383611d86565b505050565b6000600980549050905090565b610a8f611d7e565b73ffffffffffffffffffffffffffffffffffffffff16610aad611535565b73ffffffffffffffffffffffffffffffffffffffff1614610b03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610afa906137c7565b60405180910390fd5b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b610b6f610b69611d7e565b82611e3f565b610bae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba590613859565b60405180910390fd5b610bb9838383611f1d565b505050565b6000610bc98361123c565b8210610c0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c01906138eb565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610c6b611d7e565b73ffffffffffffffffffffffffffffffffffffffff16610c89611535565b73ffffffffffffffffffffffffffffffffffffffff1614610cdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd6906137c7565b60405180910390fd5b6001600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b610d42611d7e565b73ffffffffffffffffffffffffffffffffffffffff16610d60611535565b73ffffffffffffffffffffffffffffffffffffffff1614610db6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dad906137c7565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610e01573d6000803e3d6000fd5b5050565b612710610e10610a7a565b10610e50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4790613957565b60405180910390fd5b60001515600e60009054906101000a900460ff16151514610ea6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9d906139c3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0d90613a2f565b60405180910390fd5b6000600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905060008115610fac57610fa56064610f97600d546064610f869190613a7e565b600c5461217990919063ffffffff16565b61218f90919063ffffffff16565b9050610fb2565b600c5490505b34811115610ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fec90613afe565b60405180910390fd5b610fff84846121a5565b8161105d576001600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b50505050565b61107e83838360405180602001604052806000815250611811565b505050565b600061108d610a7a565b82106110ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c590613b90565b60405180910390fd5b600982815481106110e2576110e1613bb0565b5b90600052602060002001549050919050565b6110fc611d7e565b73ffffffffffffffffffffffffffffffffffffffff1661111a611535565b73ffffffffffffffffffffffffffffffffffffffff1614611170576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611167906137c7565b60405180910390fd5b8060069080519060200190611186929190612d34565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611233576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122a90613c51565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a490613ce3565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112fc611d7e565b73ffffffffffffffffffffffffffffffffffffffff1661131a611535565b73ffffffffffffffffffffffffffffffffffffffff1614611370576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611367906137c7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36113f760006121c3565b565b6006805461140690613593565b80601f016020809104026020016040519081016040528092919081815260200182805461143290613593565b801561147f5780601f106114545761010080835404028352916020019161147f565b820191906000526020600020905b81548152906001019060200180831161146257829003601f168201915b505050505081565b606060006114948361123c565b905060008167ffffffffffffffff8111156114b2576114b1613140565b5b6040519080825280602002602001820160405280156114e05781602001602082028036833780820191505090505b50905060005b8281101561152a576114f88582610bbe565b82828151811061150b5761150a613bb0565b5b602002602001018181525050808061152290613d03565b9150506114e6565b508092505050919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611567611d7e565b73ffffffffffffffffffffffffffffffffffffffff16611585611535565b73ffffffffffffffffffffffffffffffffffffffff16146115db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d2906137c7565b60405180910390fd5b80600c8190555050565b6060600180546115f490613593565b80601f016020809104026020016040519081016040528092919081815260200182805461162090613593565b801561166d5780601f106116425761010080835404028352916020019161166d565b820191906000526020600020905b81548152906001019060200180831161165057829003601f168201915b5050505050905090565b600c5481565b611685611d7e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ea90613d98565b60405180910390fd5b8060056000611700611d7e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117ad611d7e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117f29190612e8b565b60405180910390a35050565b600e60009054906101000a900460ff1681565b61182261181c611d7e565b83611e3f565b611861576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185890613859565b60405180910390fd5b61186d84848484612289565b50505050565b606061187e82611d12565b6118bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b490613e2a565b60405180910390fd5b60006118c76122e5565b905060008151116118e75760405180602001604052806000815250611912565b806118f184612377565b604051602001611902929190613e86565b6040516020818303038152906040525b915050919050565b61271081565b611928611d7e565b73ffffffffffffffffffffffffffffffffffffffff16611946611535565b73ffffffffffffffffffffffffffffffffffffffff161461199c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611993906137c7565b60405180910390fd5b80600d8190555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a42611d7e565b73ffffffffffffffffffffffffffffffffffffffff16611a60611535565b73ffffffffffffffffffffffffffffffffffffffff1614611ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aad906137c7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1d90613f1c565b60405180910390fd5b611b2f816121c3565b50565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b611b90611d7e565b73ffffffffffffffffffffffffffffffffffffffff16611bae611535565b73ffffffffffffffffffffffffffffffffffffffff1614611c04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfb906137c7565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611cfb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611d0b5750611d0a826124d8565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611df98361118a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611e4a82611d12565b611e89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8090613fae565b60405180910390fd5b6000611e948361118a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611f0357508373ffffffffffffffffffffffffffffffffffffffff16611eeb846108dd565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f145750611f1381856119a6565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611f3d8261118a565b73ffffffffffffffffffffffffffffffffffffffff1614611f93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8a90614040565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612003576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffa906140d2565b60405180910390fd5b61200e838383612542565b612019600082611d86565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120699190613a7e565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120c091906140f2565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600081836121879190614148565b905092915050565b6000818361219d91906141d1565b905092915050565b6121bf828260405180602001604052806000815250612656565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612294848484611f1d565b6122a0848484846126b1565b6122df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d690614274565b60405180910390fd5b50505050565b6060600680546122f490613593565b80601f016020809104026020016040519081016040528092919081815260200182805461232090613593565b801561236d5780601f106123425761010080835404028352916020019161236d565b820191906000526020600020905b81548152906001019060200180831161235057829003601f168201915b5050505050905090565b606060008214156123bf576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506124d3565b600082905060005b600082146123f15780806123da90613d03565b915050600a826123ea91906141d1565b91506123c7565b60008167ffffffffffffffff81111561240d5761240c613140565b5b6040519080825280601f01601f19166020018201604052801561243f5781602001600182028036833780820191505090505b5090505b600085146124cc576001826124589190613a7e565b9150600a856124679190614294565b603061247391906140f2565b60f81b81838151811061248957612488613bb0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856124c591906141d1565b9450612443565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61254d838383612848565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125905761258b8161284d565b6125cf565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146125ce576125cd8382612896565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126125761260d81612a03565b612651565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146126505761264f8282612ad4565b5b5b505050565b6126608383612b53565b61266d60008484846126b1565b6126ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126a390614274565b60405180910390fd5b505050565b60006126d28473ffffffffffffffffffffffffffffffffffffffff16612d21565b1561283b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126fb611d7e565b8786866040518563ffffffff1660e01b815260040161271d949392919061431a565b602060405180830381600087803b15801561273757600080fd5b505af192505050801561276857506040513d601f19601f82011682018060405250810190612765919061437b565b60015b6127eb573d8060008114612798576040519150601f19603f3d011682016040523d82523d6000602084013e61279d565b606091505b506000815114156127e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127da90614274565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612840565b600190505b949350505050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016128a38461123c565b6128ad9190613a7e565b9050600060086000848152602001908152602001600020549050818114612992576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600980549050612a179190613a7e565b90506000600a6000848152602001908152602001600020549050600060098381548110612a4757612a46613bb0565b5b906000526020600020015490508060098381548110612a6957612a68613bb0565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a6000858152602001908152602001600020600090556009805480612ab857612ab76143a8565b5b6001900381819060005260206000200160009055905550505050565b6000612adf8361123c565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bba90614423565b60405180910390fd5b612bcc81611d12565b15612c0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c039061448f565b60405180910390fd5b612c1860008383612542565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c6891906140f2565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612d4090613593565b90600052602060002090601f016020900481019282612d625760008555612da9565b82601f10612d7b57805160ff1916838001178555612da9565b82800160010185558215612da9579182015b82811115612da8578251825591602001919060010190612d8d565b5b509050612db69190612dba565b5090565b5b80821115612dd3576000816000905550600101612dbb565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612e2081612deb565b8114612e2b57600080fd5b50565b600081359050612e3d81612e17565b92915050565b600060208284031215612e5957612e58612de1565b5b6000612e6784828501612e2e565b91505092915050565b60008115159050919050565b612e8581612e70565b82525050565b6000602082019050612ea06000830184612e7c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612ee0578082015181840152602081019050612ec5565b83811115612eef576000848401525b50505050565b6000601f19601f8301169050919050565b6000612f1182612ea6565b612f1b8185612eb1565b9350612f2b818560208601612ec2565b612f3481612ef5565b840191505092915050565b60006020820190508181036000830152612f598184612f06565b905092915050565b6000819050919050565b612f7481612f61565b8114612f7f57600080fd5b50565b600081359050612f9181612f6b565b92915050565b600060208284031215612fad57612fac612de1565b5b6000612fbb84828501612f82565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612fef82612fc4565b9050919050565b612fff81612fe4565b82525050565b600060208201905061301a6000830184612ff6565b92915050565b61302981612fe4565b811461303457600080fd5b50565b60008135905061304681613020565b92915050565b6000806040838503121561306357613062612de1565b5b600061307185828601613037565b925050602061308285828601612f82565b9150509250929050565b61309581612f61565b82525050565b60006020820190506130b0600083018461308c565b92915050565b6000602082840312156130cc576130cb612de1565b5b60006130da84828501613037565b91505092915050565b6000806000606084860312156130fc576130fb612de1565b5b600061310a86828701613037565b935050602061311b86828701613037565b925050604061312c86828701612f82565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61317882612ef5565b810181811067ffffffffffffffff8211171561319757613196613140565b5b80604052505050565b60006131aa612dd7565b90506131b6828261316f565b919050565b600067ffffffffffffffff8211156131d6576131d5613140565b5b6131df82612ef5565b9050602081019050919050565b82818337600083830152505050565b600061320e613209846131bb565b6131a0565b90508281526020810184848401111561322a5761322961313b565b5b6132358482856131ec565b509392505050565b600082601f83011261325257613251613136565b5b81356132628482602086016131fb565b91505092915050565b60006020828403121561328157613280612de1565b5b600082013567ffffffffffffffff81111561329f5761329e612de6565b5b6132ab8482850161323d565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6132e981612f61565b82525050565b60006132fb83836132e0565b60208301905092915050565b6000602082019050919050565b600061331f826132b4565b61332981856132bf565b9350613334836132d0565b8060005b8381101561336557815161334c88826132ef565b975061335783613307565b925050600181019050613338565b5085935050505092915050565b6000602082019050818103600083015261338c8184613314565b905092915050565b61339d81612e70565b81146133a857600080fd5b50565b6000813590506133ba81613394565b92915050565b600080604083850312156133d7576133d6612de1565b5b60006133e585828601613037565b92505060206133f6858286016133ab565b9150509250929050565b600067ffffffffffffffff82111561341b5761341a613140565b5b61342482612ef5565b9050602081019050919050565b600061344461343f84613400565b6131a0565b9050828152602081018484840111156134605761345f61313b565b5b61346b8482856131ec565b509392505050565b600082601f83011261348857613487613136565b5b8135613498848260208601613431565b91505092915050565b600080600080608085870312156134bb576134ba612de1565b5b60006134c987828801613037565b94505060206134da87828801613037565b93505060406134eb87828801612f82565b925050606085013567ffffffffffffffff81111561350c5761350b612de6565b5b61351887828801613473565b91505092959194509250565b6000806040838503121561353b5761353a612de1565b5b600061354985828601613037565b925050602061355a85828601613037565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806135ab57607f821691505b602082108114156135bf576135be613564565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613621602c83612eb1565b915061362c826135c5565b604082019050919050565b6000602082019050818103600083015261365081613614565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006136b3602183612eb1565b91506136be82613657565b604082019050919050565b600060208201905081810360008301526136e2816136a6565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613745603883612eb1565b9150613750826136e9565b604082019050919050565b6000602082019050818103600083015261377481613738565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006137b1602083612eb1565b91506137bc8261377b565b602082019050919050565b600060208201905081810360008301526137e0816137a4565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613843603183612eb1565b915061384e826137e7565b604082019050919050565b6000602082019050818103600083015261387281613836565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006138d5602b83612eb1565b91506138e082613879565b604082019050919050565b60006020820190508181036000830152613904816138c8565b9050919050565b7f4d696e7420776f75642065786365656420746f74616c537570706c7900000000600082015250565b6000613941601c83612eb1565b915061394c8261390b565b602082019050919050565b6000602082019050818103600083015261397081613934565b9050919050565b7f53616c65206973206e6f742061637469766520617420746865206d6f6d656e74600082015250565b60006139ad602083612eb1565b91506139b882613977565b602082019050919050565b600060208201905081810360008301526139dc816139a0565b9050919050565b7f4d696e7420746f20746865207a65726f20616464726573730000000000000000600082015250565b6000613a19601883612eb1565b9150613a24826139e3565b602082019050919050565b60006020820190508181036000830152613a4881613a0c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a8982612f61565b9150613a9483612f61565b925082821015613aa757613aa6613a4f565b5b828203905092915050565b7f77726f6e6720616d6f756e742073656e74000000000000000000000000000000600082015250565b6000613ae8601183612eb1565b9150613af382613ab2565b602082019050919050565b60006020820190508181036000830152613b1781613adb565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613b7a602c83612eb1565b9150613b8582613b1e565b604082019050919050565b60006020820190508181036000830152613ba981613b6d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613c3b602983612eb1565b9150613c4682613bdf565b604082019050919050565b60006020820190508181036000830152613c6a81613c2e565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613ccd602a83612eb1565b9150613cd882613c71565b604082019050919050565b60006020820190508181036000830152613cfc81613cc0565b9050919050565b6000613d0e82612f61565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d4157613d40613a4f565b5b600182019050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613d82601983612eb1565b9150613d8d82613d4c565b602082019050919050565b60006020820190508181036000830152613db181613d75565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613e14602f83612eb1565b9150613e1f82613db8565b604082019050919050565b60006020820190508181036000830152613e4381613e07565b9050919050565b600081905092915050565b6000613e6082612ea6565b613e6a8185613e4a565b9350613e7a818560208601612ec2565b80840191505092915050565b6000613e928285613e55565b9150613e9e8284613e55565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613f06602683612eb1565b9150613f1182613eaa565b604082019050919050565b60006020820190508181036000830152613f3581613ef9565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613f98602c83612eb1565b9150613fa382613f3c565b604082019050919050565b60006020820190508181036000830152613fc781613f8b565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b600061402a602983612eb1565b915061403582613fce565b604082019050919050565b600060208201905081810360008301526140598161401d565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006140bc602483612eb1565b91506140c782614060565b604082019050919050565b600060208201905081810360008301526140eb816140af565b9050919050565b60006140fd82612f61565b915061410883612f61565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561413d5761413c613a4f565b5b828201905092915050565b600061415382612f61565b915061415e83612f61565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561419757614196613a4f565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006141dc82612f61565b91506141e783612f61565b9250826141f7576141f66141a2565b5b828204905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061425e603283612eb1565b915061426982614202565b604082019050919050565b6000602082019050818103600083015261428d81614251565b9050919050565b600061429f82612f61565b91506142aa83612f61565b9250826142ba576142b96141a2565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006142ec826142c5565b6142f681856142d0565b9350614306818560208601612ec2565b61430f81612ef5565b840191505092915050565b600060808201905061432f6000830187612ff6565b61433c6020830186612ff6565b614349604083018561308c565b818103606083015261435b81846142e1565b905095945050505050565b60008151905061437581612e17565b92915050565b60006020828403121561439157614390612de1565b5b600061439f84828501614366565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061440d602083612eb1565b9150614418826143d7565b602082019050919050565b6000602082019050818103600083015261443c81614400565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614479601c83612eb1565b915061448482614443565b602082019050919050565b600060208201905081810360008301526144a88161446c565b905091905056fea26469706673582212204dce50d143bcdc1effbd36ef8fe16f36ff775cf2b41d45f909b9fcb84ffe400664736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003568747470733a2f2f6d657461646174612e636f6c6f722e6d757365756d2f6170692f76312f696d6167652f6765742d696d6167652f0000000000000000000000
-----Decoded View---------------
Arg [0] : baseURI (string): https://metadata.color.museum/api/v1/image/get-image/
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [2] : 68747470733a2f2f6d657461646174612e636f6c6f722e6d757365756d2f6170
Arg [3] : 692f76312f696d6167652f6765742d696d6167652f0000000000000000000000
Deployed Bytecode Sourcemap
49175:2524:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43000:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30982:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32536:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32059:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43640:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50849:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33426:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43308:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50745:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51556:140;;;;;;;;;;;;;:::i;:::-;;49692:624;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33836:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43830:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50325:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30676:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30406:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28067:150;;;;;;;;;;;;;:::i;:::-;;29704:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51197:351;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27416:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50521:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31151:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49377:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32829:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49475:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34092:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31326:324;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49329:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50621:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33195:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28372:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50957:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50430:83;;;;;;;;;;;;;:::i;:::-;;43000:224;43102:4;43141:35;43126:50;;;:11;:50;;;;:90;;;;43180:36;43204:11;43180:23;:36::i;:::-;43126:90;43119:97;;43000:224;;;:::o;30982:100::-;31036:13;31069:5;31062:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30982:100;:::o;32536:221::-;32612:7;32640:16;32648:7;32640;:16::i;:::-;32632:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32725:15;:24;32741:7;32725:24;;;;;;;;;;;;;;;;;;;;;32718:31;;32536:221;;;:::o;32059:411::-;32140:13;32156:23;32171:7;32156:14;:23::i;:::-;32140:39;;32204:5;32198:11;;:2;:11;;;;32190:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;32298:5;32282:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;32307:37;32324:5;32331:12;:10;:12::i;:::-;32307:16;:37::i;:::-;32282:62;32260:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;32441:21;32450:2;32454:7;32441:8;:21::i;:::-;32129:341;32059:411;;:::o;43640:113::-;43701:7;43728:10;:17;;;;43721:24;;43640:113;:::o;50849:100::-;27647:12;:10;:12::i;:::-;27636:23;;:7;:5;:7::i;:::-;:23;;;27628:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50936:5:::1;50916:11;:17;50928:4;50916:17;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;50849:100:::0;:::o;33426:339::-;33621:41;33640:12;:10;:12::i;:::-;33654:7;33621:18;:41::i;:::-;33613:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33729:28;33739:4;33745:2;33749:7;33729:9;:28::i;:::-;33426:339;;;:::o;43308:256::-;43405:7;43441:23;43458:5;43441:16;:23::i;:::-;43433:5;:31;43425:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;43530:12;:19;43543:5;43530:19;;;;;;;;;;;;;;;:26;43550:5;43530:26;;;;;;;;;;;;43523:33;;43308:256;;;;:::o;50745:96::-;27647:12;:10;:12::i;:::-;27636:23;;:7;:5;:7::i;:::-;:23;;;27628:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50829:4:::1;50809:11;:17;50821:4;50809:17;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;50745:96:::0;:::o;51556:140::-;27647:12;:10;:12::i;:::-;27636:23;;:7;:5;:7::i;:::-;:23;;;27628:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51604:12:::1;51619:21;51604:36;;51659:10;51651:28;;:37;51680:7;51651:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;51593:103;51556:140::o:0;49692:624::-;49365:5;51108:13;:11;:13::i;:::-;:28;51100:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;49793:5:::1;49781:17;;:8;;;;;;;;;;;:17;;;49773:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;49869:1;49854:17;;:3;:17;;;;49846:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;49911:19;49933:11;:16;49945:3;49933:16;;;;;;;;;;;;;;;;;;;;;;;;;49911:38;;49960:13;49989:14;49986:145;;;50028:45;50069:3;50028:36;50044:19;;50038:3;:25;;;;:::i;:::-;50028:5;;:9;;:36;;;;:::i;:::-;:40;;:45;;;;:::i;:::-;50020:53;;49986:145;;;50114:5;;50106:13;;49986:145;50160:9;50151:5;:18;;50143:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;50202:24;50212:3;50217:8;50202:9;:24::i;:::-;50241:14;50237:70;;50291:4;50272:11;:16;50284:3;50272:16;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;50237:70;49762:554;;49692:624:::0;;:::o;33836:185::-;33974:39;33991:4;33997:2;34001:7;33974:39;;;;;;;;;;;;:16;:39::i;:::-;33836:185;;;:::o;43830:233::-;43905:7;43941:30;:28;:30::i;:::-;43933:5;:38;43925:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;44038:10;44049:5;44038:17;;;;;;;;:::i;:::-;;;;;;;;;;44031:24;;43830:233;;;:::o;50325:97::-;27647:12;:10;:12::i;:::-;27636:23;;:7;:5;:7::i;:::-;:23;;;27628:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50407:7:::1;50396:8;:18;;;;;;;;;;;;:::i;:::-;;50325:97:::0;:::o;30676:239::-;30748:7;30768:13;30784:7;:16;30792:7;30784:16;;;;;;;;;;;;;;;;;;;;;30768:32;;30836:1;30819:19;;:5;:19;;;;30811:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30902:5;30895:12;;;30676:239;;;:::o;30406:208::-;30478:7;30523:1;30506:19;;:5;:19;;;;30498:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;30590:9;:16;30600:5;30590:16;;;;;;;;;;;;;;;;30583:23;;30406:208;;;:::o;28067:150::-;27647:12;:10;:12::i;:::-;27636:23;;:7;:5;:7::i;:::-;:23;;;27628:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28174:1:::1;28137:40;;28158:6;;;;;;;;;;;28137:40;;;;;;;;;;;;28188:21;28206:1;28188:9;:21::i;:::-;28067:150::o:0;29704:22::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51197:351::-;51257:16;51291:13;51307:17;51317:6;51307:9;:17::i;:::-;51291:33;;51335:23;51375:5;51361:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51335:46;;51397:13;51392:125;51424:5;51416;:13;51392:125;;;51471:34;51491:6;51499:5;51471:19;:34::i;:::-;51455:6;51462:5;51455:13;;;;;;;;:::i;:::-;;;;;;;:50;;;;;51431:7;;;;;:::i;:::-;;;;51392:125;;;;51534:6;51527:13;;;;51197:351;;;:::o;27416:87::-;27462:7;27489:6;;;;;;;;;;;27482:13;;27416:87;:::o;50521:92::-;27647:12;:10;:12::i;:::-;27636:23;;:7;:5;:7::i;:::-;:23;;;27628:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50596:9:::1;50588:5;:17;;;;50521:92:::0;:::o;31151:104::-;31207:13;31240:7;31233:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31151:104;:::o;49377:40::-;;;;:::o;32829:295::-;32944:12;:10;:12::i;:::-;32932:24;;:8;:24;;;;32924:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;33044:8;32999:18;:32;33018:12;:10;:12::i;:::-;32999:32;;;;;;;;;;;;;;;:42;33032:8;32999:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;33097:8;33068:48;;33083:12;:10;:12::i;:::-;33068:48;;;33107:8;33068:48;;;;;;:::i;:::-;;;;;;;;32829:295;;:::o;49475:27::-;;;;;;;;;;;;;:::o;34092:328::-;34267:41;34286:12;:10;:12::i;:::-;34300:7;34267:18;:41::i;:::-;34259:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;34373:39;34387:4;34393:2;34397:7;34406:5;34373:13;:39::i;:::-;34092:328;;;;:::o;31326:324::-;31399:13;31433:16;31441:7;31433;:16::i;:::-;31425:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;31514:18;31535:9;:7;:9::i;:::-;31514:30;;31583:1;31568:4;31562:18;:22;:80;;;;;;;;;;;;;;;;;31611:4;31617:18;:7;:16;:18::i;:::-;31594:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;31562:80;31555:87;;;31326:324;;;:::o;49329:41::-;49365:5;49329:41;:::o;50621:116::-;27647:12;:10;:12::i;:::-;27636:23;;:7;:5;:7::i;:::-;:23;;;27628:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50720:9:::1;50698:19;:31;;;;50621:116:::0;:::o;33195:164::-;33292:4;33316:18;:25;33335:5;33316:25;;;;;;;;;;;;;;;:35;33342:8;33316:35;;;;;;;;;;;;;;;;;;;;;;;;;33309:42;;33195:164;;;;:::o;28372:192::-;27647:12;:10;:12::i;:::-;27636:23;;:7;:5;:7::i;:::-;:23;;;27628:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28481:1:::1;28461:22;;:8;:22;;;;28453:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28537:19;28547:8;28537:9;:19::i;:::-;28372:192:::0;:::o;50957:105::-;51013:4;51037:11;:17;51049:4;51037:17;;;;;;;;;;;;;;;;;;;;;;;;;51030:24;;50957:105;;;:::o;50430:83::-;27647:12;:10;:12::i;:::-;27636:23;;:7;:5;:7::i;:::-;:23;;;27628:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50497:8:::1;;;;;;;;;;;50496:9;50485:8;;:20;;;;;;;;;;;;;;;;;;50430:83::o:0;30037:305::-;30139:4;30191:25;30176:40;;;:11;:40;;;;:105;;;;30248:33;30233:48;;;:11;:48;;;;30176:105;:158;;;;30298:36;30322:11;30298:23;:36::i;:::-;30176:158;30156:178;;30037:305;;;:::o;35930:127::-;35995:4;36047:1;36019:30;;:7;:16;36027:7;36019:16;;;;;;;;;;;;;;;;;;;;;:30;;;;36012:37;;35930:127;;;:::o;26167:98::-;26220:7;26247:10;26240:17;;26167:98;:::o;39912:174::-;40014:2;39987:15;:24;40003:7;39987:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;40070:7;40066:2;40032:46;;40041:23;40056:7;40041:14;:23::i;:::-;40032:46;;;;;;;;;;;;39912:174;;:::o;36224:348::-;36317:4;36342:16;36350:7;36342;:16::i;:::-;36334:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36418:13;36434:23;36449:7;36434:14;:23::i;:::-;36418:39;;36487:5;36476:16;;:7;:16;;;:51;;;;36520:7;36496:31;;:20;36508:7;36496:11;:20::i;:::-;:31;;;36476:51;:87;;;;36531:32;36548:5;36555:7;36531:16;:32::i;:::-;36476:87;36468:96;;;36224:348;;;;:::o;39216:578::-;39375:4;39348:31;;:23;39363:7;39348:14;:23::i;:::-;:31;;;39340:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;39458:1;39444:16;;:2;:16;;;;39436:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;39514:39;39535:4;39541:2;39545:7;39514:20;:39::i;:::-;39618:29;39635:1;39639:7;39618:8;:29::i;:::-;39679:1;39660:9;:15;39670:4;39660:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;39708:1;39691:9;:13;39701:2;39691:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39739:2;39720:7;:16;39728:7;39720:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39778:7;39774:2;39759:27;;39768:4;39759:27;;;;;;;;;;;;39216:578;;;:::o;3501:98::-;3559:7;3590:1;3586;:5;;;;:::i;:::-;3579:12;;3501:98;;;;:::o;3900:::-;3958:7;3989:1;3985;:5;;;;:::i;:::-;3978:12;;3900:98;;;;:::o;36914:110::-;36990:26;37000:2;37004:7;36990:26;;;;;;;;;;;;:9;:26::i;:::-;36914:110;;:::o;28572:173::-;28628:16;28647:6;;;;;;;;;;;28628:25;;28673:8;28664:6;;:17;;;;;;;;;;;;;;;;;;28728:8;28697:40;;28718:8;28697:40;;;;;;;;;;;;28617:128;28572:173;:::o;35302:315::-;35459:28;35469:4;35475:2;35479:7;35459:9;:28::i;:::-;35506:48;35529:4;35535:2;35539:7;35548:5;35506:22;:48::i;:::-;35498:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;35302:315;;;;:::o;31898:99::-;31948:13;31981:8;31974:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31898:99;:::o;7181:723::-;7237:13;7467:1;7458:5;:10;7454:53;;;7485:10;;;;;;;;;;;;;;;;;;;;;7454:53;7517:12;7532:5;7517:20;;7548:14;7573:78;7588:1;7580:4;:9;7573:78;;7606:8;;;;;:::i;:::-;;;;7637:2;7629:10;;;;;:::i;:::-;;;7573:78;;;7661:19;7693:6;7683:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7661:39;;7711:154;7727:1;7718:5;:10;7711:154;;7755:1;7745:11;;;;;:::i;:::-;;;7822:2;7814:5;:10;;;;:::i;:::-;7801:2;:24;;;;:::i;:::-;7788:39;;7771:6;7778;7771:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;7851:2;7842:11;;;;;:::i;:::-;;;7711:154;;;7889:6;7875:21;;;;;7181:723;;;;:::o;19153:157::-;19238:4;19277:25;19262:40;;;:11;:40;;;;19255:47;;19153:157;;;:::o;44676:589::-;44820:45;44847:4;44853:2;44857:7;44820:26;:45::i;:::-;44898:1;44882:18;;:4;:18;;;44878:187;;;44917:40;44949:7;44917:31;:40::i;:::-;44878:187;;;44987:2;44979:10;;:4;:10;;;44975:90;;45006:47;45039:4;45045:7;45006:32;:47::i;:::-;44975:90;44878:187;45093:1;45079:16;;:2;:16;;;45075:183;;;45112:45;45149:7;45112:36;:45::i;:::-;45075:183;;;45185:4;45179:10;;:2;:10;;;45175:83;;45206:40;45234:2;45238:7;45206:27;:40::i;:::-;45175:83;45075:183;44676:589;;;:::o;37251:321::-;37381:18;37387:2;37391:7;37381:5;:18::i;:::-;37432:54;37463:1;37467:2;37471:7;37480:5;37432:22;:54::i;:::-;37410:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;37251:321;;;:::o;40651:803::-;40806:4;40827:15;:2;:13;;;:15::i;:::-;40823:624;;;40879:2;40863:36;;;40900:12;:10;:12::i;:::-;40914:4;40920:7;40929:5;40863:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40859:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41126:1;41109:6;:13;:18;41105:272;;;41152:60;;;;;;;;;;:::i;:::-;;;;;;;;41105:272;41327:6;41321:13;41312:6;41308:2;41304:15;41297:38;40859:533;40996:45;;;40986:55;;;:6;:55;;;;40979:62;;;;;40823:624;41431:4;41424:11;;40651:803;;;;;;;:::o;42026:126::-;;;;:::o;45988:164::-;46092:10;:17;;;;46065:15;:24;46081:7;46065:24;;;;;;;;;;;:44;;;;46120:10;46136:7;46120:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45988:164;:::o;46779:988::-;47045:22;47095:1;47070:22;47087:4;47070:16;:22::i;:::-;:26;;;;:::i;:::-;47045:51;;47107:18;47128:17;:26;47146:7;47128:26;;;;;;;;;;;;47107:47;;47275:14;47261:10;:28;47257:328;;47306:19;47328:12;:18;47341:4;47328:18;;;;;;;;;;;;;;;:34;47347:14;47328:34;;;;;;;;;;;;47306:56;;47412:11;47379:12;:18;47392:4;47379:18;;;;;;;;;;;;;;;:30;47398:10;47379:30;;;;;;;;;;;:44;;;;47529:10;47496:17;:30;47514:11;47496:30;;;;;;;;;;;:43;;;;47291:294;47257:328;47681:17;:26;47699:7;47681:26;;;;;;;;;;;47674:33;;;47725:12;:18;47738:4;47725:18;;;;;;;;;;;;;;;:34;47744:14;47725:34;;;;;;;;;;;47718:41;;;46860:907;;46779:988;;:::o;48062:1079::-;48315:22;48360:1;48340:10;:17;;;;:21;;;;:::i;:::-;48315:46;;48372:18;48393:15;:24;48409:7;48393:24;;;;;;;;;;;;48372:45;;48744:19;48766:10;48777:14;48766:26;;;;;;;;:::i;:::-;;;;;;;;;;48744:48;;48830:11;48805:10;48816;48805:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;48941:10;48910:15;:28;48926:11;48910:28;;;;;;;;;;;:41;;;;49082:15;:24;49098:7;49082:24;;;;;;;;;;;49075:31;;;49117:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;48133:1008;;;48062:1079;:::o;45566:221::-;45651:14;45668:20;45685:2;45668:16;:20::i;:::-;45651:37;;45726:7;45699:12;:16;45712:2;45699:16;;;;;;;;;;;;;;;:24;45716:6;45699:24;;;;;;;;;;;:34;;;;45773:6;45744:17;:26;45762:7;45744:26;;;;;;;;;;;:35;;;;45640:147;45566:221;;:::o;37908:382::-;38002:1;37988:16;;:2;:16;;;;37980:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;38061:16;38069:7;38061;:16::i;:::-;38060:17;38052:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;38123:45;38152:1;38156:2;38160:7;38123:20;:45::i;:::-;38198:1;38181:9;:13;38191:2;38181:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;38229:2;38210:7;:16;38218:7;38210:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;38274:7;38270:2;38249:33;;38266:1;38249:33;;;;;;;;;;;;37908:382;;:::o;9648:387::-;9708:4;9916:12;9983:7;9971:20;9963:28;;10026:1;10019:4;:8;10012:15;;;9648:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:329::-;5349:6;5398:2;5386:9;5377:7;5373:23;5369:32;5366:119;;;5404:79;;:::i;:::-;5366:119;5524:1;5549:53;5594:7;5585:6;5574:9;5570:22;5549:53;:::i;:::-;5539:63;;5495:117;5290:329;;;;:::o;5625:619::-;5702:6;5710;5718;5767:2;5755:9;5746:7;5742:23;5738:32;5735:119;;;5773:79;;:::i;:::-;5735:119;5893:1;5918:53;5963:7;5954:6;5943:9;5939:22;5918:53;:::i;:::-;5908:63;;5864:117;6020:2;6046:53;6091:7;6082:6;6071:9;6067:22;6046:53;:::i;:::-;6036:63;;5991:118;6148:2;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6119:118;5625:619;;;;;:::o;6250:117::-;6359:1;6356;6349:12;6373:117;6482:1;6479;6472:12;6496:180;6544:77;6541:1;6534:88;6641:4;6638:1;6631:15;6665:4;6662:1;6655:15;6682:281;6765:27;6787:4;6765:27;:::i;:::-;6757:6;6753:40;6895:6;6883:10;6880:22;6859:18;6847:10;6844:34;6841:62;6838:88;;;6906:18;;:::i;:::-;6838:88;6946:10;6942:2;6935:22;6725:238;6682:281;;:::o;6969:129::-;7003:6;7030:20;;:::i;:::-;7020:30;;7059:33;7087:4;7079:6;7059:33;:::i;:::-;6969:129;;;:::o;7104:308::-;7166:4;7256:18;7248:6;7245:30;7242:56;;;7278:18;;:::i;:::-;7242:56;7316:29;7338:6;7316:29;:::i;:::-;7308:37;;7400:4;7394;7390:15;7382:23;;7104:308;;;:::o;7418:154::-;7502:6;7497:3;7492;7479:30;7564:1;7555:6;7550:3;7546:16;7539:27;7418:154;;;:::o;7578:412::-;7656:5;7681:66;7697:49;7739:6;7697:49;:::i;:::-;7681:66;:::i;:::-;7672:75;;7770:6;7763:5;7756:21;7808:4;7801:5;7797:16;7846:3;7837:6;7832:3;7828:16;7825:25;7822:112;;;7853:79;;:::i;:::-;7822:112;7943:41;7977:6;7972:3;7967;7943:41;:::i;:::-;7662:328;7578:412;;;;;:::o;8010:340::-;8066:5;8115:3;8108:4;8100:6;8096:17;8092:27;8082:122;;8123:79;;:::i;:::-;8082:122;8240:6;8227:20;8265:79;8340:3;8332:6;8325:4;8317:6;8313:17;8265:79;:::i;:::-;8256:88;;8072:278;8010:340;;;;:::o;8356:509::-;8425:6;8474:2;8462:9;8453:7;8449:23;8445:32;8442:119;;;8480:79;;:::i;:::-;8442:119;8628:1;8617:9;8613:17;8600:31;8658:18;8650:6;8647:30;8644:117;;;8680:79;;:::i;:::-;8644:117;8785:63;8840:7;8831:6;8820:9;8816:22;8785:63;:::i;:::-;8775:73;;8571:287;8356:509;;;;:::o;8871:114::-;8938:6;8972:5;8966:12;8956:22;;8871:114;;;:::o;8991:184::-;9090:11;9124:6;9119:3;9112:19;9164:4;9159:3;9155:14;9140:29;;8991:184;;;;:::o;9181:132::-;9248:4;9271:3;9263:11;;9301:4;9296:3;9292:14;9284:22;;9181:132;;;:::o;9319:108::-;9396:24;9414:5;9396:24;:::i;:::-;9391:3;9384:37;9319:108;;:::o;9433:179::-;9502:10;9523:46;9565:3;9557:6;9523:46;:::i;:::-;9601:4;9596:3;9592:14;9578:28;;9433:179;;;;:::o;9618:113::-;9688:4;9720;9715:3;9711:14;9703:22;;9618:113;;;:::o;9767:732::-;9886:3;9915:54;9963:5;9915:54;:::i;:::-;9985:86;10064:6;10059:3;9985:86;:::i;:::-;9978:93;;10095:56;10145:5;10095:56;:::i;:::-;10174:7;10205:1;10190:284;10215:6;10212:1;10209:13;10190:284;;;10291:6;10285:13;10318:63;10377:3;10362:13;10318:63;:::i;:::-;10311:70;;10404:60;10457:6;10404:60;:::i;:::-;10394:70;;10250:224;10237:1;10234;10230:9;10225:14;;10190:284;;;10194:14;10490:3;10483:10;;9891:608;;;9767:732;;;;:::o;10505:373::-;10648:4;10686:2;10675:9;10671:18;10663:26;;10735:9;10729:4;10725:20;10721:1;10710:9;10706:17;10699:47;10763:108;10866:4;10857:6;10763:108;:::i;:::-;10755:116;;10505:373;;;;:::o;10884:116::-;10954:21;10969:5;10954:21;:::i;:::-;10947:5;10944:32;10934:60;;10990:1;10987;10980:12;10934:60;10884:116;:::o;11006:133::-;11049:5;11087:6;11074:20;11065:29;;11103:30;11127:5;11103:30;:::i;:::-;11006:133;;;;:::o;11145:468::-;11210:6;11218;11267:2;11255:9;11246:7;11242:23;11238:32;11235:119;;;11273:79;;:::i;:::-;11235:119;11393:1;11418:53;11463:7;11454:6;11443:9;11439:22;11418:53;:::i;:::-;11408:63;;11364:117;11520:2;11546:50;11588:7;11579:6;11568:9;11564:22;11546:50;:::i;:::-;11536:60;;11491:115;11145:468;;;;;:::o;11619:307::-;11680:4;11770:18;11762:6;11759:30;11756:56;;;11792:18;;:::i;:::-;11756:56;11830:29;11852:6;11830:29;:::i;:::-;11822:37;;11914:4;11908;11904:15;11896:23;;11619:307;;;:::o;11932:410::-;12009:5;12034:65;12050:48;12091:6;12050:48;:::i;:::-;12034:65;:::i;:::-;12025:74;;12122:6;12115:5;12108:21;12160:4;12153:5;12149:16;12198:3;12189:6;12184:3;12180:16;12177:25;12174:112;;;12205:79;;:::i;:::-;12174:112;12295:41;12329:6;12324:3;12319;12295:41;:::i;:::-;12015:327;11932:410;;;;;:::o;12361:338::-;12416:5;12465:3;12458:4;12450:6;12446:17;12442:27;12432:122;;12473:79;;:::i;:::-;12432:122;12590:6;12577:20;12615:78;12689:3;12681:6;12674:4;12666:6;12662:17;12615:78;:::i;:::-;12606:87;;12422:277;12361:338;;;;:::o;12705:943::-;12800:6;12808;12816;12824;12873:3;12861:9;12852:7;12848:23;12844:33;12841:120;;;12880:79;;:::i;:::-;12841:120;13000:1;13025:53;13070:7;13061:6;13050:9;13046:22;13025:53;:::i;:::-;13015:63;;12971:117;13127:2;13153:53;13198:7;13189:6;13178:9;13174:22;13153:53;:::i;:::-;13143:63;;13098:118;13255:2;13281:53;13326:7;13317:6;13306:9;13302:22;13281:53;:::i;:::-;13271:63;;13226:118;13411:2;13400:9;13396:18;13383:32;13442:18;13434:6;13431:30;13428:117;;;13464:79;;:::i;:::-;13428:117;13569:62;13623:7;13614:6;13603:9;13599:22;13569:62;:::i;:::-;13559:72;;13354:287;12705:943;;;;;;;:::o;13654:474::-;13722:6;13730;13779:2;13767:9;13758:7;13754:23;13750:32;13747:119;;;13785:79;;:::i;:::-;13747:119;13905:1;13930:53;13975:7;13966:6;13955:9;13951:22;13930:53;:::i;:::-;13920:63;;13876:117;14032:2;14058:53;14103:7;14094:6;14083:9;14079:22;14058:53;:::i;:::-;14048:63;;14003:118;13654:474;;;;;:::o;14134:180::-;14182:77;14179:1;14172:88;14279:4;14276:1;14269:15;14303:4;14300:1;14293:15;14320:320;14364:6;14401:1;14395:4;14391:12;14381:22;;14448:1;14442:4;14438:12;14469:18;14459:81;;14525:4;14517:6;14513:17;14503:27;;14459:81;14587:2;14579:6;14576:14;14556:18;14553:38;14550:84;;;14606:18;;:::i;:::-;14550:84;14371:269;14320:320;;;:::o;14646:231::-;14786:34;14782:1;14774:6;14770:14;14763:58;14855:14;14850:2;14842:6;14838:15;14831:39;14646:231;:::o;14883:366::-;15025:3;15046:67;15110:2;15105:3;15046:67;:::i;:::-;15039:74;;15122:93;15211:3;15122:93;:::i;:::-;15240:2;15235:3;15231:12;15224:19;;14883:366;;;:::o;15255:419::-;15421:4;15459:2;15448:9;15444:18;15436:26;;15508:9;15502:4;15498:20;15494:1;15483:9;15479:17;15472:47;15536:131;15662:4;15536:131;:::i;:::-;15528:139;;15255:419;;;:::o;15680:220::-;15820:34;15816:1;15808:6;15804:14;15797:58;15889:3;15884:2;15876:6;15872:15;15865:28;15680:220;:::o;15906:366::-;16048:3;16069:67;16133:2;16128:3;16069:67;:::i;:::-;16062:74;;16145:93;16234:3;16145:93;:::i;:::-;16263:2;16258:3;16254:12;16247:19;;15906:366;;;:::o;16278:419::-;16444:4;16482:2;16471:9;16467:18;16459:26;;16531:9;16525:4;16521:20;16517:1;16506:9;16502:17;16495:47;16559:131;16685:4;16559:131;:::i;:::-;16551:139;;16278:419;;;:::o;16703:243::-;16843:34;16839:1;16831:6;16827:14;16820:58;16912:26;16907:2;16899:6;16895:15;16888:51;16703:243;:::o;16952:366::-;17094:3;17115:67;17179:2;17174:3;17115:67;:::i;:::-;17108:74;;17191:93;17280:3;17191:93;:::i;:::-;17309:2;17304:3;17300:12;17293:19;;16952:366;;;:::o;17324:419::-;17490:4;17528:2;17517:9;17513:18;17505:26;;17577:9;17571:4;17567:20;17563:1;17552:9;17548:17;17541:47;17605:131;17731:4;17605:131;:::i;:::-;17597:139;;17324:419;;;:::o;17749:182::-;17889:34;17885:1;17877:6;17873:14;17866:58;17749:182;:::o;17937:366::-;18079:3;18100:67;18164:2;18159:3;18100:67;:::i;:::-;18093:74;;18176:93;18265:3;18176:93;:::i;:::-;18294:2;18289:3;18285:12;18278:19;;17937:366;;;:::o;18309:419::-;18475:4;18513:2;18502:9;18498:18;18490:26;;18562:9;18556:4;18552:20;18548:1;18537:9;18533:17;18526:47;18590:131;18716:4;18590:131;:::i;:::-;18582:139;;18309:419;;;:::o;18734:236::-;18874:34;18870:1;18862:6;18858:14;18851:58;18943:19;18938:2;18930:6;18926:15;18919:44;18734:236;:::o;18976:366::-;19118:3;19139:67;19203:2;19198:3;19139:67;:::i;:::-;19132:74;;19215:93;19304:3;19215:93;:::i;:::-;19333:2;19328:3;19324:12;19317:19;;18976:366;;;:::o;19348:419::-;19514:4;19552:2;19541:9;19537:18;19529:26;;19601:9;19595:4;19591:20;19587:1;19576:9;19572:17;19565:47;19629:131;19755:4;19629:131;:::i;:::-;19621:139;;19348:419;;;:::o;19773:230::-;19913:34;19909:1;19901:6;19897:14;19890:58;19982:13;19977:2;19969:6;19965:15;19958:38;19773:230;:::o;20009:366::-;20151:3;20172:67;20236:2;20231:3;20172:67;:::i;:::-;20165:74;;20248:93;20337:3;20248:93;:::i;:::-;20366:2;20361:3;20357:12;20350:19;;20009:366;;;:::o;20381:419::-;20547:4;20585:2;20574:9;20570:18;20562:26;;20634:9;20628:4;20624:20;20620:1;20609:9;20605:17;20598:47;20662:131;20788:4;20662:131;:::i;:::-;20654:139;;20381:419;;;:::o;20806:178::-;20946:30;20942:1;20934:6;20930:14;20923:54;20806:178;:::o;20990:366::-;21132:3;21153:67;21217:2;21212:3;21153:67;:::i;:::-;21146:74;;21229:93;21318:3;21229:93;:::i;:::-;21347:2;21342:3;21338:12;21331:19;;20990:366;;;:::o;21362:419::-;21528:4;21566:2;21555:9;21551:18;21543:26;;21615:9;21609:4;21605:20;21601:1;21590:9;21586:17;21579:47;21643:131;21769:4;21643:131;:::i;:::-;21635:139;;21362:419;;;:::o;21787:182::-;21927:34;21923:1;21915:6;21911:14;21904:58;21787:182;:::o;21975:366::-;22117:3;22138:67;22202:2;22197:3;22138:67;:::i;:::-;22131:74;;22214:93;22303:3;22214:93;:::i;:::-;22332:2;22327:3;22323:12;22316:19;;21975:366;;;:::o;22347:419::-;22513:4;22551:2;22540:9;22536:18;22528:26;;22600:9;22594:4;22590:20;22586:1;22575:9;22571:17;22564:47;22628:131;22754:4;22628:131;:::i;:::-;22620:139;;22347:419;;;:::o;22772:174::-;22912:26;22908:1;22900:6;22896:14;22889:50;22772:174;:::o;22952:366::-;23094:3;23115:67;23179:2;23174:3;23115:67;:::i;:::-;23108:74;;23191:93;23280:3;23191:93;:::i;:::-;23309:2;23304:3;23300:12;23293:19;;22952:366;;;:::o;23324:419::-;23490:4;23528:2;23517:9;23513:18;23505:26;;23577:9;23571:4;23567:20;23563:1;23552:9;23548:17;23541:47;23605:131;23731:4;23605:131;:::i;:::-;23597:139;;23324:419;;;:::o;23749:180::-;23797:77;23794:1;23787:88;23894:4;23891:1;23884:15;23918:4;23915:1;23908:15;23935:191;23975:4;23995:20;24013:1;23995:20;:::i;:::-;23990:25;;24029:20;24047:1;24029:20;:::i;:::-;24024:25;;24068:1;24065;24062:8;24059:34;;;24073:18;;:::i;:::-;24059:34;24118:1;24115;24111:9;24103:17;;23935:191;;;;:::o;24132:167::-;24272:19;24268:1;24260:6;24256:14;24249:43;24132:167;:::o;24305:366::-;24447:3;24468:67;24532:2;24527:3;24468:67;:::i;:::-;24461:74;;24544:93;24633:3;24544:93;:::i;:::-;24662:2;24657:3;24653:12;24646:19;;24305:366;;;:::o;24677:419::-;24843:4;24881:2;24870:9;24866:18;24858:26;;24930:9;24924:4;24920:20;24916:1;24905:9;24901:17;24894:47;24958:131;25084:4;24958:131;:::i;:::-;24950:139;;24677:419;;;:::o;25102:231::-;25242:34;25238:1;25230:6;25226:14;25219:58;25311:14;25306:2;25298:6;25294:15;25287:39;25102:231;:::o;25339:366::-;25481:3;25502:67;25566:2;25561:3;25502:67;:::i;:::-;25495:74;;25578:93;25667:3;25578:93;:::i;:::-;25696:2;25691:3;25687:12;25680:19;;25339:366;;;:::o;25711:419::-;25877:4;25915:2;25904:9;25900:18;25892:26;;25964:9;25958:4;25954:20;25950:1;25939:9;25935:17;25928:47;25992:131;26118:4;25992:131;:::i;:::-;25984:139;;25711:419;;;:::o;26136:180::-;26184:77;26181:1;26174:88;26281:4;26278:1;26271:15;26305:4;26302:1;26295:15;26322:228;26462:34;26458:1;26450:6;26446:14;26439:58;26531:11;26526:2;26518:6;26514:15;26507:36;26322:228;:::o;26556:366::-;26698:3;26719:67;26783:2;26778:3;26719:67;:::i;:::-;26712:74;;26795:93;26884:3;26795:93;:::i;:::-;26913:2;26908:3;26904:12;26897:19;;26556:366;;;:::o;26928:419::-;27094:4;27132:2;27121:9;27117:18;27109:26;;27181:9;27175:4;27171:20;27167:1;27156:9;27152:17;27145:47;27209:131;27335:4;27209:131;:::i;:::-;27201:139;;26928:419;;;:::o;27353:229::-;27493:34;27489:1;27481:6;27477:14;27470:58;27562:12;27557:2;27549:6;27545:15;27538:37;27353:229;:::o;27588:366::-;27730:3;27751:67;27815:2;27810:3;27751:67;:::i;:::-;27744:74;;27827:93;27916:3;27827:93;:::i;:::-;27945:2;27940:3;27936:12;27929:19;;27588:366;;;:::o;27960:419::-;28126:4;28164:2;28153:9;28149:18;28141:26;;28213:9;28207:4;28203:20;28199:1;28188:9;28184:17;28177:47;28241:131;28367:4;28241:131;:::i;:::-;28233:139;;27960:419;;;:::o;28385:233::-;28424:3;28447:24;28465:5;28447:24;:::i;:::-;28438:33;;28493:66;28486:5;28483:77;28480:103;;;28563:18;;:::i;:::-;28480:103;28610:1;28603:5;28599:13;28592:20;;28385:233;;;:::o;28624:175::-;28764:27;28760:1;28752:6;28748:14;28741:51;28624:175;:::o;28805:366::-;28947:3;28968:67;29032:2;29027:3;28968:67;:::i;:::-;28961:74;;29044:93;29133:3;29044:93;:::i;:::-;29162:2;29157:3;29153:12;29146:19;;28805:366;;;:::o;29177:419::-;29343:4;29381:2;29370:9;29366:18;29358:26;;29430:9;29424:4;29420:20;29416:1;29405:9;29401:17;29394:47;29458:131;29584:4;29458:131;:::i;:::-;29450:139;;29177:419;;;:::o;29602:234::-;29742:34;29738:1;29730:6;29726:14;29719:58;29811:17;29806:2;29798:6;29794:15;29787:42;29602:234;:::o;29842:366::-;29984:3;30005:67;30069:2;30064:3;30005:67;:::i;:::-;29998:74;;30081:93;30170:3;30081:93;:::i;:::-;30199:2;30194:3;30190:12;30183:19;;29842:366;;;:::o;30214:419::-;30380:4;30418:2;30407:9;30403:18;30395:26;;30467:9;30461:4;30457:20;30453:1;30442:9;30438:17;30431:47;30495:131;30621:4;30495:131;:::i;:::-;30487:139;;30214:419;;;:::o;30639:148::-;30741:11;30778:3;30763:18;;30639:148;;;;:::o;30793:377::-;30899:3;30927:39;30960:5;30927:39;:::i;:::-;30982:89;31064:6;31059:3;30982:89;:::i;:::-;30975:96;;31080:52;31125:6;31120:3;31113:4;31106:5;31102:16;31080:52;:::i;:::-;31157:6;31152:3;31148:16;31141:23;;30903:267;30793:377;;;;:::o;31176:435::-;31356:3;31378:95;31469:3;31460:6;31378:95;:::i;:::-;31371:102;;31490:95;31581:3;31572:6;31490:95;:::i;:::-;31483:102;;31602:3;31595:10;;31176:435;;;;;:::o;31617:225::-;31757:34;31753:1;31745:6;31741:14;31734:58;31826:8;31821:2;31813:6;31809:15;31802:33;31617:225;:::o;31848:366::-;31990:3;32011:67;32075:2;32070:3;32011:67;:::i;:::-;32004:74;;32087:93;32176:3;32087:93;:::i;:::-;32205:2;32200:3;32196:12;32189:19;;31848:366;;;:::o;32220:419::-;32386:4;32424:2;32413:9;32409:18;32401:26;;32473:9;32467:4;32463:20;32459:1;32448:9;32444:17;32437:47;32501:131;32627:4;32501:131;:::i;:::-;32493:139;;32220:419;;;:::o;32645:231::-;32785:34;32781:1;32773:6;32769:14;32762:58;32854:14;32849:2;32841:6;32837:15;32830:39;32645:231;:::o;32882:366::-;33024:3;33045:67;33109:2;33104:3;33045:67;:::i;:::-;33038:74;;33121:93;33210:3;33121:93;:::i;:::-;33239:2;33234:3;33230:12;33223:19;;32882:366;;;:::o;33254:419::-;33420:4;33458:2;33447:9;33443:18;33435:26;;33507:9;33501:4;33497:20;33493:1;33482:9;33478:17;33471:47;33535:131;33661:4;33535:131;:::i;:::-;33527:139;;33254:419;;;:::o;33679:228::-;33819:34;33815:1;33807:6;33803:14;33796:58;33888:11;33883:2;33875:6;33871:15;33864:36;33679:228;:::o;33913:366::-;34055:3;34076:67;34140:2;34135:3;34076:67;:::i;:::-;34069:74;;34152:93;34241:3;34152:93;:::i;:::-;34270:2;34265:3;34261:12;34254:19;;33913:366;;;:::o;34285:419::-;34451:4;34489:2;34478:9;34474:18;34466:26;;34538:9;34532:4;34528:20;34524:1;34513:9;34509:17;34502:47;34566:131;34692:4;34566:131;:::i;:::-;34558:139;;34285:419;;;:::o;34710:223::-;34850:34;34846:1;34838:6;34834:14;34827:58;34919:6;34914:2;34906:6;34902:15;34895:31;34710:223;:::o;34939:366::-;35081:3;35102:67;35166:2;35161:3;35102:67;:::i;:::-;35095:74;;35178:93;35267:3;35178:93;:::i;:::-;35296:2;35291:3;35287:12;35280:19;;34939:366;;;:::o;35311:419::-;35477:4;35515:2;35504:9;35500:18;35492:26;;35564:9;35558:4;35554:20;35550:1;35539:9;35535:17;35528:47;35592:131;35718:4;35592:131;:::i;:::-;35584:139;;35311:419;;;:::o;35736:305::-;35776:3;35795:20;35813:1;35795:20;:::i;:::-;35790:25;;35829:20;35847:1;35829:20;:::i;:::-;35824:25;;35983:1;35915:66;35911:74;35908:1;35905:81;35902:107;;;35989:18;;:::i;:::-;35902:107;36033:1;36030;36026:9;36019:16;;35736:305;;;;:::o;36047:348::-;36087:7;36110:20;36128:1;36110:20;:::i;:::-;36105:25;;36144:20;36162:1;36144:20;:::i;:::-;36139:25;;36332:1;36264:66;36260:74;36257:1;36254:81;36249:1;36242:9;36235:17;36231:105;36228:131;;;36339:18;;:::i;:::-;36228:131;36387:1;36384;36380:9;36369:20;;36047:348;;;;:::o;36401:180::-;36449:77;36446:1;36439:88;36546:4;36543:1;36536:15;36570:4;36567:1;36560:15;36587:185;36627:1;36644:20;36662:1;36644:20;:::i;:::-;36639:25;;36678:20;36696:1;36678:20;:::i;:::-;36673:25;;36717:1;36707:35;;36722:18;;:::i;:::-;36707:35;36764:1;36761;36757:9;36752:14;;36587:185;;;;:::o;36778:237::-;36918:34;36914:1;36906:6;36902:14;36895:58;36987:20;36982:2;36974:6;36970:15;36963:45;36778:237;:::o;37021:366::-;37163:3;37184:67;37248:2;37243:3;37184:67;:::i;:::-;37177:74;;37260:93;37349:3;37260:93;:::i;:::-;37378:2;37373:3;37369:12;37362:19;;37021:366;;;:::o;37393:419::-;37559:4;37597:2;37586:9;37582:18;37574:26;;37646:9;37640:4;37636:20;37632:1;37621:9;37617:17;37610:47;37674:131;37800:4;37674:131;:::i;:::-;37666:139;;37393:419;;;:::o;37818:176::-;37850:1;37867:20;37885:1;37867:20;:::i;:::-;37862:25;;37901:20;37919:1;37901:20;:::i;:::-;37896:25;;37940:1;37930:35;;37945:18;;:::i;:::-;37930:35;37986:1;37983;37979:9;37974:14;;37818:176;;;;:::o;38000:98::-;38051:6;38085:5;38079:12;38069:22;;38000:98;;;:::o;38104:168::-;38187:11;38221:6;38216:3;38209:19;38261:4;38256:3;38252:14;38237:29;;38104:168;;;;:::o;38278:360::-;38364:3;38392:38;38424:5;38392:38;:::i;:::-;38446:70;38509:6;38504:3;38446:70;:::i;:::-;38439:77;;38525:52;38570:6;38565:3;38558:4;38551:5;38547:16;38525:52;:::i;:::-;38602:29;38624:6;38602:29;:::i;:::-;38597:3;38593:39;38586:46;;38368:270;38278:360;;;;:::o;38644:640::-;38839:4;38877:3;38866:9;38862:19;38854:27;;38891:71;38959:1;38948:9;38944:17;38935:6;38891:71;:::i;:::-;38972:72;39040:2;39029:9;39025:18;39016:6;38972:72;:::i;:::-;39054;39122:2;39111:9;39107:18;39098:6;39054:72;:::i;:::-;39173:9;39167:4;39163:20;39158:2;39147:9;39143:18;39136:48;39201:76;39272:4;39263:6;39201:76;:::i;:::-;39193:84;;38644:640;;;;;;;:::o;39290:141::-;39346:5;39377:6;39371:13;39362:22;;39393:32;39419:5;39393:32;:::i;:::-;39290:141;;;;:::o;39437:349::-;39506:6;39555:2;39543:9;39534:7;39530:23;39526:32;39523:119;;;39561:79;;:::i;:::-;39523:119;39681:1;39706:63;39761:7;39752:6;39741:9;39737:22;39706:63;:::i;:::-;39696:73;;39652:127;39437:349;;;;:::o;39792:180::-;39840:77;39837:1;39830:88;39937:4;39934:1;39927:15;39961:4;39958:1;39951:15;39978:182;40118:34;40114:1;40106:6;40102:14;40095:58;39978:182;:::o;40166:366::-;40308:3;40329:67;40393:2;40388:3;40329:67;:::i;:::-;40322:74;;40405:93;40494:3;40405:93;:::i;:::-;40523:2;40518:3;40514:12;40507:19;;40166:366;;;:::o;40538:419::-;40704:4;40742:2;40731:9;40727:18;40719:26;;40791:9;40785:4;40781:20;40777:1;40766:9;40762:17;40755:47;40819:131;40945:4;40819:131;:::i;:::-;40811:139;;40538:419;;;:::o;40963:178::-;41103:30;41099:1;41091:6;41087:14;41080:54;40963:178;:::o;41147:366::-;41289:3;41310:67;41374:2;41369:3;41310:67;:::i;:::-;41303:74;;41386:93;41475:3;41386:93;:::i;:::-;41504:2;41499:3;41495:12;41488:19;;41147:366;;;:::o;41519:419::-;41685:4;41723:2;41712:9;41708:18;41700:26;;41772:9;41766:4;41762:20;41758:1;41747:9;41743:17;41736:47;41800:131;41926:4;41800:131;:::i;:::-;41792:139;;41519:419;;;:::o
Swarm Source
ipfs://4dce50d143bcdc1effbd36ef8fe16f36ff775cf2b41d45f909b9fcb84ffe4006
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.