Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
342 PIGZ
Holders
195
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 PIGZLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
PiggiePalzHalloween
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-10-17 */ // File: @openzeppelin/contracts/utils/Counters.sol pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/utils/math/SafeMath.sol 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; } } } // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol 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() { _setOwner(_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 { _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); } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol 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(); } } // File: contracts/PiggiePalzHalloween.sol // contracts/PiggiePalzHalloween.sol pragma solidity ^0.8.7; contract PiggiePalzHalloween is ERC721Enumerable, Ownable { using SafeMath for uint256; mapping(uint256 => uint8) minted; // Pigs that are minted already mapping(uint256 => address) piggieHolders; // Piggie owners and their pigs address public constant creatorAddress = 0x16658DBA4856b698faDAed8E6096E975e0040ab2; address public constant devAddress = 0xeAe1561c3d6AD5F1396843d9Ea2400a1D27688f2; bool public mintActive; string private baseTokenURI; event PigId(uint256 id); constructor(string memory baseURI) ERC721("Piggie Palz Zombie Edition 2021", "PIGZ") { setBaseURI(baseURI); } modifier whenMintActive() { require(mintActive, "Zombie Piggie Palz have not risen from the dead!"); _; } function startMint() external onlyOwner { require(!mintActive, "Zombie Piggie Palz are already awake!"); mintActive = true; } function pauseMint() external onlyOwner { mintActive = false; } function mintMyZombiePig(uint256 pigId) public whenMintActive { require(minted[pigId] != 1, "Piggie already minted."); require(pigId > 0 && pigId < 401, "Piggie Palz ID should be between 1 and 400."); require(piggieHolders[pigId] == msg.sender, "This Piggie doesn't belong to you!"); minted[pigId] = 1; _safeMint(_msgSender(), pigId); emit PigId(pigId); } function whitelistAllAddresses(address[] memory users, uint256[] memory pigIds) public onlyOwner { for (uint i = 0; i < users.length; i++) { piggieHolders[pigIds[i]] = users[i]; } } function whitelistPigForAddress(address user, uint256 pigId) public onlyOwner { piggieHolders[pigId] = user; } function getWhitelistedAddressForPig(uint256 pigId) external view returns (address) { return piggieHolders[pigId]; } function removeAddressFromPig(uint256 pigId) public onlyOwner { piggieHolders[pigId] = address(0); } function _baseURI() internal view virtual override returns (string memory) { return baseTokenURI; } function setBaseURI(string memory baseURI) public onlyOwner { baseTokenURI = baseURI; } }
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":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"PigId","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":[{"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":"creatorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pigId","type":"uint256"}],"name":"getWhitelistedAddressForPig","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":"mintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pigId","type":"uint256"}],"name":"mintMyZombiePig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pigId","type":"uint256"}],"name":"removeAddressFromPig","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":[],"name":"startMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"uint256[]","name":"pigIds","type":"uint256[]"}],"name":"whitelistAllAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"pigId","type":"uint256"}],"name":"whitelistPigForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620048f0380380620048f08339818101604052810190620000379190620003e0565b6040518060400160405280601f81526020017f5069676769652050616c7a205a6f6d6269652045646974696f6e2032303231008152506040518060400160405280600481526020017f5049475a000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000bb929190620002b2565b508060019080519060200190620000d4929190620002b2565b505050620000f7620000eb6200010f60201b60201c565b6200011760201b60201c565b6200010881620001dd60201b60201c565b5062000638565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620001ed6200010f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002136200028860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200026c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002639062000458565b60405180910390fd5b80600e908051906020019062000284929190620002b2565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620002c09062000520565b90600052602060002090601f016020900481019282620002e4576000855562000330565b82601f10620002ff57805160ff191683800117855562000330565b8280016001018555821562000330579182015b828111156200032f57825182559160200191906001019062000312565b5b5090506200033f919062000343565b5090565b5b808211156200035e57600081600090555060010162000344565b5090565b6000620003796200037384620004a3565b6200047a565b905082815260208101848484011115620003985762000397620005ef565b5b620003a5848285620004ea565b509392505050565b600082601f830112620003c557620003c4620005ea565b5b8151620003d784826020860162000362565b91505092915050565b600060208284031215620003f957620003f8620005f9565b5b600082015167ffffffffffffffff8111156200041a5762000419620005f4565b5b6200042884828501620003ad565b91505092915050565b600062000440602083620004d9565b91506200044d826200060f565b602082019050919050565b60006020820190508181036000830152620004738162000431565b9050919050565b60006200048662000499565b905062000494828262000556565b919050565b6000604051905090565b600067ffffffffffffffff821115620004c157620004c0620005bb565b5b620004cc82620005fe565b9050602081019050919050565b600082825260208201905092915050565b60005b838110156200050a578082015181840152602081019050620004ed565b838111156200051a576000848401525b50505050565b600060028204905060018216806200053957607f821691505b6020821081141562000550576200054f6200058c565b5b50919050565b6200056182620005fe565b810181811067ffffffffffffffff82111715620005835762000582620005bb565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6142a880620006486000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c8063455c2c9f1161010457806395d89b41116100a2578063cd85cdb511610071578063cd85cdb51461053f578063e927fc5c14610549578063e985e9c514610567578063f2fde38b14610597576101da565b806395d89b41146104b9578063a22cb465146104d7578063b88d4fde146104f3578063c87b56dd1461050f576101da565b80636352211e116100de5780636352211e1461043157806370a0823114610461578063715018a6146104915780638da5cb5b1461049b576101da565b8063455c2c9f146103b55780634f6ccce7146103e557806355f804b314610415576101da565b806323b872dd1161017c5780632f745c591161014b5780632f745c591461032f57806335c88b791461035f5780633ad10ef61461037b57806342842e0e14610399576101da565b806323b872dd146102cf57806325fd90f3146102eb5780632be09561146103095780632ca9591914610313576101da565b8063095ea7b3116101b8578063095ea7b31461025d5780630a661b1f1461027957806315dd03a91461029557806318160ddd146102b1576101da565b806301ffc9a7146101df57806306fdde031461020f578063081812fc1461022d575b600080fd5b6101f960048036038101906101f49190612e7f565b6105b3565b60405161020691906133cf565b60405180910390f35b61021761062d565b60405161022491906133ea565b60405180910390f35b61024760048036038101906102429190612f22565b6106bf565b6040516102549190613368565b60405180910390f35b61027760048036038101906102729190612dc7565b610744565b005b610293600480360381019061028e9190612f22565b61085c565b005b6102af60048036038101906102aa9190612dc7565b610a7b565b005b6102b9610b4d565b6040516102c691906136ec565b60405180910390f35b6102e960048036038101906102e49190612cb1565b610b5a565b005b6102f3610bba565b60405161030091906133cf565b60405180910390f35b610311610bcd565b005b61032d60048036038101906103289190612e07565b610cb6565b005b61034960048036038101906103449190612dc7565b610ddc565b60405161035691906136ec565b60405180910390f35b61037960048036038101906103749190612f22565b610e81565b005b610383610f53565b6040516103909190613368565b60405180910390f35b6103b360048036038101906103ae9190612cb1565b610f6b565b005b6103cf60048036038101906103ca9190612f22565b610f8b565b6040516103dc9190613368565b60405180910390f35b6103ff60048036038101906103fa9190612f22565b610fc8565b60405161040c91906136ec565b60405180910390f35b61042f600480360381019061042a9190612ed9565b611039565b005b61044b60048036038101906104469190612f22565b6110cf565b6040516104589190613368565b60405180910390f35b61047b60048036038101906104769190612c44565b611181565b60405161048891906136ec565b60405180910390f35b610499611239565b005b6104a36112c1565b6040516104b09190613368565b60405180910390f35b6104c16112eb565b6040516104ce91906133ea565b60405180910390f35b6104f160048036038101906104ec9190612d87565b61137d565b005b61050d60048036038101906105089190612d04565b6114fe565b005b61052960048036038101906105249190612f22565b611560565b60405161053691906133ea565b60405180910390f35b610547611607565b005b6105516116a0565b60405161055e9190613368565b60405180910390f35b610581600480360381019061057c9190612c71565b6116b8565b60405161058e91906133cf565b60405180910390f35b6105b160048036038101906105ac9190612c44565b61174c565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610626575061062582611844565b5b9050919050565b60606000805461063c9061399a565b80601f01602080910402602001604051908101604052809291908181526020018280546106689061399a565b80156106b55780601f1061068a576101008083540402835291602001916106b5565b820191906000526020600020905b81548152906001019060200180831161069857829003601f168201915b5050505050905090565b60006106ca82611926565b610709576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610700906135ac565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061074f826110cf565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b79061364c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107df611992565b73ffffffffffffffffffffffffffffffffffffffff16148061080e575061080d81610808611992565b6116b8565b5b61084d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610844906134ec565b60405180910390fd5b610857838361199a565b505050565b600d60009054906101000a900460ff166108ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a2906136cc565b60405180910390fd5b6001600b600083815260200190815260200160002060009054906101000a900460ff1660ff161415610912576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610909906136ac565b60405180910390fd5b600081118015610923575061019181105b610962576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109599061354c565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600c600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fa9061356c565b60405180910390fd5b6001600b600083815260200190815260200160002060006101000a81548160ff021916908360ff160217905550610a41610a3b611992565b82611a53565b7fee31d73c130c544025f7761bf07e046251769933f83f23847a96e879d885401181604051610a7091906136ec565b60405180910390a150565b610a83611992565b73ffffffffffffffffffffffffffffffffffffffff16610aa16112c1565b73ffffffffffffffffffffffffffffffffffffffff1614610af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aee906135cc565b60405180910390fd5b81600c600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600880549050905090565b610b6b610b65611992565b82611a71565b610baa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba19061366c565b60405180910390fd5b610bb5838383611b4f565b505050565b600d60009054906101000a900460ff1681565b610bd5611992565b73ffffffffffffffffffffffffffffffffffffffff16610bf36112c1565b73ffffffffffffffffffffffffffffffffffffffff1614610c49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c40906135cc565b60405180910390fd5b600d60009054906101000a900460ff1615610c99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c90906135ec565b60405180910390fd5b6001600d60006101000a81548160ff021916908315150217905550565b610cbe611992565b73ffffffffffffffffffffffffffffffffffffffff16610cdc6112c1565b73ffffffffffffffffffffffffffffffffffffffff1614610d32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d29906135cc565b60405180910390fd5b60005b8251811015610dd757828181518110610d5157610d50613b33565b5b6020026020010151600c6000848481518110610d7057610d6f613b33565b5b6020026020010151815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508080610dcf906139fd565b915050610d35565b505050565b6000610de783611181565b8210610e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1f9061340c565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610e89611992565b73ffffffffffffffffffffffffffffffffffffffff16610ea76112c1565b73ffffffffffffffffffffffffffffffffffffffff1614610efd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef4906135cc565b60405180910390fd5b6000600c600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b73eae1561c3d6ad5f1396843d9ea2400a1d27688f281565b610f86838383604051806020016040528060008152506114fe565b505050565b6000600c600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610fd2610b4d565b8210611013576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100a9061368c565b60405180910390fd5b6008828154811061102757611026613b33565b5b90600052602060002001549050919050565b611041611992565b73ffffffffffffffffffffffffffffffffffffffff1661105f6112c1565b73ffffffffffffffffffffffffffffffffffffffff16146110b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ac906135cc565b60405180910390fd5b80600e90805190602001906110cb92919061291c565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116f9061352c565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e99061350c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611241611992565b73ffffffffffffffffffffffffffffffffffffffff1661125f6112c1565b73ffffffffffffffffffffffffffffffffffffffff16146112b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ac906135cc565b60405180910390fd5b6112bf6000611dab565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546112fa9061399a565b80601f01602080910402602001604051908101604052809291908181526020018280546113269061399a565b80156113735780601f1061134857610100808354040283529160200191611373565b820191906000526020600020905b81548152906001019060200180831161135657829003601f168201915b5050505050905090565b611385611992565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ea906134ac565b60405180910390fd5b8060056000611400611992565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114ad611992565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114f291906133cf565b60405180910390a35050565b61150f611509611992565b83611a71565b61154e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115459061366c565b60405180910390fd5b61155a84848484611e71565b50505050565b606061156b82611926565b6115aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a19061362c565b60405180910390fd5b60006115b4611ecd565b905060008151116115d457604051806020016040528060008152506115ff565b806115de84611f5f565b6040516020016115ef929190613344565b6040516020818303038152906040525b915050919050565b61160f611992565b73ffffffffffffffffffffffffffffffffffffffff1661162d6112c1565b73ffffffffffffffffffffffffffffffffffffffff1614611683576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167a906135cc565b60405180910390fd5b6000600d60006101000a81548160ff021916908315150217905550565b7316658dba4856b698fadaed8e6096e975e0040ab281565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611754611992565b73ffffffffffffffffffffffffffffffffffffffff166117726112c1565b73ffffffffffffffffffffffffffffffffffffffff16146117c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bf906135cc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611838576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182f9061344c565b60405180910390fd5b61184181611dab565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061190f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061191f575061191e826120c0565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611a0d836110cf565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611a6d82826040518060200160405280600081525061212a565b5050565b6000611a7c82611926565b611abb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab2906134cc565b60405180910390fd5b6000611ac6836110cf565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611b3557508373ffffffffffffffffffffffffffffffffffffffff16611b1d846106bf565b73ffffffffffffffffffffffffffffffffffffffff16145b80611b465750611b4581856116b8565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b6f826110cf565b73ffffffffffffffffffffffffffffffffffffffff1614611bc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbc9061360c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2c9061348c565b60405180910390fd5b611c40838383612185565b611c4b60008261199a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c9b91906138b0565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cf29190613829565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611e7c848484611b4f565b611e8884848484612299565b611ec7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebe9061342c565b60405180910390fd5b50505050565b6060600e8054611edc9061399a565b80601f0160208091040260200160405190810160405280929190818152602001828054611f089061399a565b8015611f555780601f10611f2a57610100808354040283529160200191611f55565b820191906000526020600020905b815481529060010190602001808311611f3857829003601f168201915b5050505050905090565b60606000821415611fa7576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506120bb565b600082905060005b60008214611fd9578080611fc2906139fd565b915050600a82611fd2919061387f565b9150611faf565b60008167ffffffffffffffff811115611ff557611ff4613b62565b5b6040519080825280601f01601f1916602001820160405280156120275781602001600182028036833780820191505090505b5090505b600085146120b45760018261204091906138b0565b9150600a8561204f9190613a46565b603061205b9190613829565b60f81b81838151811061207157612070613b33565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120ad919061387f565b945061202b565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6121348383612430565b6121416000848484612299565b612180576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121779061342c565b60405180910390fd5b505050565b6121908383836125fe565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156121d3576121ce81612603565b612212565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461221157612210838261264c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561225557612250816127b9565b612294565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461229357612292828261288a565b5b5b505050565b60006122ba8473ffffffffffffffffffffffffffffffffffffffff16612909565b15612423578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122e3611992565b8786866040518563ffffffff1660e01b81526004016123059493929190613383565b602060405180830381600087803b15801561231f57600080fd5b505af192505050801561235057506040513d601f19601f8201168201806040525081019061234d9190612eac565b60015b6123d3573d8060008114612380576040519150601f19603f3d011682016040523d82523d6000602084013e612385565b606091505b506000815114156123cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c29061342c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612428565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124979061358c565b60405180910390fd5b6124a981611926565b156124e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e09061346c565b60405180910390fd5b6124f560008383612185565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125459190613829565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161265984611181565b61266391906138b0565b9050600060076000848152602001908152602001600020549050818114612748576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506127cd91906138b0565b90506000600960008481526020019081526020016000205490506000600883815481106127fd576127fc613b33565b5b90600052602060002001549050806008838154811061281f5761281e613b33565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061286e5761286d613b04565b5b6001900381819060005260206000200160009055905550505050565b600061289583611181565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b8280546129289061399a565b90600052602060002090601f01602090048101928261294a5760008555612991565b82601f1061296357805160ff1916838001178555612991565b82800160010185558215612991579182015b82811115612990578251825591602001919060010190612975565b5b50905061299e91906129a2565b5090565b5b808211156129bb5760008160009055506001016129a3565b5090565b60006129d26129cd8461372c565b613707565b905080838252602082019050828560208602820111156129f5576129f4613b96565b5b60005b85811015612a255781612a0b8882612b23565b8452602084019350602083019250506001810190506129f8565b5050509392505050565b6000612a42612a3d84613758565b613707565b90508083825260208201905082856020860282011115612a6557612a64613b96565b5b60005b85811015612a955781612a7b8882612c2f565b845260208401935060208301925050600181019050612a68565b5050509392505050565b6000612ab2612aad84613784565b613707565b905082815260208101848484011115612ace57612acd613b9b565b5b612ad9848285613958565b509392505050565b6000612af4612aef846137b5565b613707565b905082815260208101848484011115612b1057612b0f613b9b565b5b612b1b848285613958565b509392505050565b600081359050612b3281614216565b92915050565b600082601f830112612b4d57612b4c613b91565b5b8135612b5d8482602086016129bf565b91505092915050565b600082601f830112612b7b57612b7a613b91565b5b8135612b8b848260208601612a2f565b91505092915050565b600081359050612ba38161422d565b92915050565b600081359050612bb881614244565b92915050565b600081519050612bcd81614244565b92915050565b600082601f830112612be857612be7613b91565b5b8135612bf8848260208601612a9f565b91505092915050565b600082601f830112612c1657612c15613b91565b5b8135612c26848260208601612ae1565b91505092915050565b600081359050612c3e8161425b565b92915050565b600060208284031215612c5a57612c59613ba5565b5b6000612c6884828501612b23565b91505092915050565b60008060408385031215612c8857612c87613ba5565b5b6000612c9685828601612b23565b9250506020612ca785828601612b23565b9150509250929050565b600080600060608486031215612cca57612cc9613ba5565b5b6000612cd886828701612b23565b9350506020612ce986828701612b23565b9250506040612cfa86828701612c2f565b9150509250925092565b60008060008060808587031215612d1e57612d1d613ba5565b5b6000612d2c87828801612b23565b9450506020612d3d87828801612b23565b9350506040612d4e87828801612c2f565b925050606085013567ffffffffffffffff811115612d6f57612d6e613ba0565b5b612d7b87828801612bd3565b91505092959194509250565b60008060408385031215612d9e57612d9d613ba5565b5b6000612dac85828601612b23565b9250506020612dbd85828601612b94565b9150509250929050565b60008060408385031215612dde57612ddd613ba5565b5b6000612dec85828601612b23565b9250506020612dfd85828601612c2f565b9150509250929050565b60008060408385031215612e1e57612e1d613ba5565b5b600083013567ffffffffffffffff811115612e3c57612e3b613ba0565b5b612e4885828601612b38565b925050602083013567ffffffffffffffff811115612e6957612e68613ba0565b5b612e7585828601612b66565b9150509250929050565b600060208284031215612e9557612e94613ba5565b5b6000612ea384828501612ba9565b91505092915050565b600060208284031215612ec257612ec1613ba5565b5b6000612ed084828501612bbe565b91505092915050565b600060208284031215612eef57612eee613ba5565b5b600082013567ffffffffffffffff811115612f0d57612f0c613ba0565b5b612f1984828501612c01565b91505092915050565b600060208284031215612f3857612f37613ba5565b5b6000612f4684828501612c2f565b91505092915050565b612f58816138e4565b82525050565b612f67816138f6565b82525050565b6000612f78826137e6565b612f8281856137fc565b9350612f92818560208601613967565b612f9b81613baa565b840191505092915050565b6000612fb1826137f1565b612fbb818561380d565b9350612fcb818560208601613967565b612fd481613baa565b840191505092915050565b6000612fea826137f1565b612ff4818561381e565b9350613004818560208601613967565b80840191505092915050565b600061301d602b8361380d565b915061302882613bbb565b604082019050919050565b600061304060328361380d565b915061304b82613c0a565b604082019050919050565b600061306360268361380d565b915061306e82613c59565b604082019050919050565b6000613086601c8361380d565b915061309182613ca8565b602082019050919050565b60006130a960248361380d565b91506130b482613cd1565b604082019050919050565b60006130cc60198361380d565b91506130d782613d20565b602082019050919050565b60006130ef602c8361380d565b91506130fa82613d49565b604082019050919050565b600061311260388361380d565b915061311d82613d98565b604082019050919050565b6000613135602a8361380d565b915061314082613de7565b604082019050919050565b600061315860298361380d565b915061316382613e36565b604082019050919050565b600061317b602b8361380d565b915061318682613e85565b604082019050919050565b600061319e60228361380d565b91506131a982613ed4565b604082019050919050565b60006131c160208361380d565b91506131cc82613f23565b602082019050919050565b60006131e4602c8361380d565b91506131ef82613f4c565b604082019050919050565b600061320760208361380d565b915061321282613f9b565b602082019050919050565b600061322a60258361380d565b915061323582613fc4565b604082019050919050565b600061324d60298361380d565b915061325882614013565b604082019050919050565b6000613270602f8361380d565b915061327b82614062565b604082019050919050565b600061329360218361380d565b915061329e826140b1565b604082019050919050565b60006132b660318361380d565b91506132c182614100565b604082019050919050565b60006132d9602c8361380d565b91506132e48261414f565b604082019050919050565b60006132fc60168361380d565b91506133078261419e565b602082019050919050565b600061331f60308361380d565b915061332a826141c7565b604082019050919050565b61333e8161394e565b82525050565b60006133508285612fdf565b915061335c8284612fdf565b91508190509392505050565b600060208201905061337d6000830184612f4f565b92915050565b60006080820190506133986000830187612f4f565b6133a56020830186612f4f565b6133b26040830185613335565b81810360608301526133c48184612f6d565b905095945050505050565b60006020820190506133e46000830184612f5e565b92915050565b600060208201905081810360008301526134048184612fa6565b905092915050565b6000602082019050818103600083015261342581613010565b9050919050565b6000602082019050818103600083015261344581613033565b9050919050565b6000602082019050818103600083015261346581613056565b9050919050565b6000602082019050818103600083015261348581613079565b9050919050565b600060208201905081810360008301526134a58161309c565b9050919050565b600060208201905081810360008301526134c5816130bf565b9050919050565b600060208201905081810360008301526134e5816130e2565b9050919050565b6000602082019050818103600083015261350581613105565b9050919050565b6000602082019050818103600083015261352581613128565b9050919050565b600060208201905081810360008301526135458161314b565b9050919050565b600060208201905081810360008301526135658161316e565b9050919050565b6000602082019050818103600083015261358581613191565b9050919050565b600060208201905081810360008301526135a5816131b4565b9050919050565b600060208201905081810360008301526135c5816131d7565b9050919050565b600060208201905081810360008301526135e5816131fa565b9050919050565b600060208201905081810360008301526136058161321d565b9050919050565b6000602082019050818103600083015261362581613240565b9050919050565b6000602082019050818103600083015261364581613263565b9050919050565b6000602082019050818103600083015261366581613286565b9050919050565b60006020820190508181036000830152613685816132a9565b9050919050565b600060208201905081810360008301526136a5816132cc565b9050919050565b600060208201905081810360008301526136c5816132ef565b9050919050565b600060208201905081810360008301526136e581613312565b9050919050565b60006020820190506137016000830184613335565b92915050565b6000613711613722565b905061371d82826139cc565b919050565b6000604051905090565b600067ffffffffffffffff82111561374757613746613b62565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561377357613772613b62565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561379f5761379e613b62565b5b6137a882613baa565b9050602081019050919050565b600067ffffffffffffffff8211156137d0576137cf613b62565b5b6137d982613baa565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006138348261394e565b915061383f8361394e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561387457613873613a77565b5b828201905092915050565b600061388a8261394e565b91506138958361394e565b9250826138a5576138a4613aa6565b5b828204905092915050565b60006138bb8261394e565b91506138c68361394e565b9250828210156138d9576138d8613a77565b5b828203905092915050565b60006138ef8261392e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561398557808201518184015260208101905061396a565b83811115613994576000848401525b50505050565b600060028204905060018216806139b257607f821691505b602082108114156139c6576139c5613ad5565b5b50919050565b6139d582613baa565b810181811067ffffffffffffffff821117156139f4576139f3613b62565b5b80604052505050565b6000613a088261394e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613a3b57613a3a613a77565b5b600182019050919050565b6000613a518261394e565b9150613a5c8361394e565b925082613a6c57613a6b613aa6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f5069676769652050616c7a2049442073686f756c64206265206265747765656e60008201527f203120616e64203430302e000000000000000000000000000000000000000000602082015250565b7f546869732050696767696520646f65736e27742062656c6f6e6720746f20796f60008201527f7521000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5a6f6d626965205069676769652050616c7a2061726520616c7265616479206160008201527f77616b6521000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f50696767696520616c7265616479206d696e7465642e00000000000000000000600082015250565b7f5a6f6d626965205069676769652050616c7a2068617665206e6f74207269736560008201527f6e2066726f6d2074686520646561642100000000000000000000000000000000602082015250565b61421f816138e4565b811461422a57600080fd5b50565b614236816138f6565b811461424157600080fd5b50565b61424d81613902565b811461425857600080fd5b50565b6142648161394e565b811461426f57600080fd5b5056fea2646970667358221220c08cf39dfb374509ad20ccd0afd26a8c0406d2ab9a9bf0050ad130ce472097fa64736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d534e323934677a614c744d316d6a4a34774d44516455346a6a345953376b376e6a46317a415a50756d3678622f00000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101da5760003560e01c8063455c2c9f1161010457806395d89b41116100a2578063cd85cdb511610071578063cd85cdb51461053f578063e927fc5c14610549578063e985e9c514610567578063f2fde38b14610597576101da565b806395d89b41146104b9578063a22cb465146104d7578063b88d4fde146104f3578063c87b56dd1461050f576101da565b80636352211e116100de5780636352211e1461043157806370a0823114610461578063715018a6146104915780638da5cb5b1461049b576101da565b8063455c2c9f146103b55780634f6ccce7146103e557806355f804b314610415576101da565b806323b872dd1161017c5780632f745c591161014b5780632f745c591461032f57806335c88b791461035f5780633ad10ef61461037b57806342842e0e14610399576101da565b806323b872dd146102cf57806325fd90f3146102eb5780632be09561146103095780632ca9591914610313576101da565b8063095ea7b3116101b8578063095ea7b31461025d5780630a661b1f1461027957806315dd03a91461029557806318160ddd146102b1576101da565b806301ffc9a7146101df57806306fdde031461020f578063081812fc1461022d575b600080fd5b6101f960048036038101906101f49190612e7f565b6105b3565b60405161020691906133cf565b60405180910390f35b61021761062d565b60405161022491906133ea565b60405180910390f35b61024760048036038101906102429190612f22565b6106bf565b6040516102549190613368565b60405180910390f35b61027760048036038101906102729190612dc7565b610744565b005b610293600480360381019061028e9190612f22565b61085c565b005b6102af60048036038101906102aa9190612dc7565b610a7b565b005b6102b9610b4d565b6040516102c691906136ec565b60405180910390f35b6102e960048036038101906102e49190612cb1565b610b5a565b005b6102f3610bba565b60405161030091906133cf565b60405180910390f35b610311610bcd565b005b61032d60048036038101906103289190612e07565b610cb6565b005b61034960048036038101906103449190612dc7565b610ddc565b60405161035691906136ec565b60405180910390f35b61037960048036038101906103749190612f22565b610e81565b005b610383610f53565b6040516103909190613368565b60405180910390f35b6103b360048036038101906103ae9190612cb1565b610f6b565b005b6103cf60048036038101906103ca9190612f22565b610f8b565b6040516103dc9190613368565b60405180910390f35b6103ff60048036038101906103fa9190612f22565b610fc8565b60405161040c91906136ec565b60405180910390f35b61042f600480360381019061042a9190612ed9565b611039565b005b61044b60048036038101906104469190612f22565b6110cf565b6040516104589190613368565b60405180910390f35b61047b60048036038101906104769190612c44565b611181565b60405161048891906136ec565b60405180910390f35b610499611239565b005b6104a36112c1565b6040516104b09190613368565b60405180910390f35b6104c16112eb565b6040516104ce91906133ea565b60405180910390f35b6104f160048036038101906104ec9190612d87565b61137d565b005b61050d60048036038101906105089190612d04565b6114fe565b005b61052960048036038101906105249190612f22565b611560565b60405161053691906133ea565b60405180910390f35b610547611607565b005b6105516116a0565b60405161055e9190613368565b60405180910390f35b610581600480360381019061057c9190612c71565b6116b8565b60405161058e91906133cf565b60405180910390f35b6105b160048036038101906105ac9190612c44565b61174c565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610626575061062582611844565b5b9050919050565b60606000805461063c9061399a565b80601f01602080910402602001604051908101604052809291908181526020018280546106689061399a565b80156106b55780601f1061068a576101008083540402835291602001916106b5565b820191906000526020600020905b81548152906001019060200180831161069857829003601f168201915b5050505050905090565b60006106ca82611926565b610709576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610700906135ac565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061074f826110cf565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b79061364c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107df611992565b73ffffffffffffffffffffffffffffffffffffffff16148061080e575061080d81610808611992565b6116b8565b5b61084d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610844906134ec565b60405180910390fd5b610857838361199a565b505050565b600d60009054906101000a900460ff166108ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a2906136cc565b60405180910390fd5b6001600b600083815260200190815260200160002060009054906101000a900460ff1660ff161415610912576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610909906136ac565b60405180910390fd5b600081118015610923575061019181105b610962576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109599061354c565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600c600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fa9061356c565b60405180910390fd5b6001600b600083815260200190815260200160002060006101000a81548160ff021916908360ff160217905550610a41610a3b611992565b82611a53565b7fee31d73c130c544025f7761bf07e046251769933f83f23847a96e879d885401181604051610a7091906136ec565b60405180910390a150565b610a83611992565b73ffffffffffffffffffffffffffffffffffffffff16610aa16112c1565b73ffffffffffffffffffffffffffffffffffffffff1614610af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aee906135cc565b60405180910390fd5b81600c600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6000600880549050905090565b610b6b610b65611992565b82611a71565b610baa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba19061366c565b60405180910390fd5b610bb5838383611b4f565b505050565b600d60009054906101000a900460ff1681565b610bd5611992565b73ffffffffffffffffffffffffffffffffffffffff16610bf36112c1565b73ffffffffffffffffffffffffffffffffffffffff1614610c49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c40906135cc565b60405180910390fd5b600d60009054906101000a900460ff1615610c99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c90906135ec565b60405180910390fd5b6001600d60006101000a81548160ff021916908315150217905550565b610cbe611992565b73ffffffffffffffffffffffffffffffffffffffff16610cdc6112c1565b73ffffffffffffffffffffffffffffffffffffffff1614610d32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d29906135cc565b60405180910390fd5b60005b8251811015610dd757828181518110610d5157610d50613b33565b5b6020026020010151600c6000848481518110610d7057610d6f613b33565b5b6020026020010151815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508080610dcf906139fd565b915050610d35565b505050565b6000610de783611181565b8210610e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1f9061340c565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610e89611992565b73ffffffffffffffffffffffffffffffffffffffff16610ea76112c1565b73ffffffffffffffffffffffffffffffffffffffff1614610efd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef4906135cc565b60405180910390fd5b6000600c600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b73eae1561c3d6ad5f1396843d9ea2400a1d27688f281565b610f86838383604051806020016040528060008152506114fe565b505050565b6000600c600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610fd2610b4d565b8210611013576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100a9061368c565b60405180910390fd5b6008828154811061102757611026613b33565b5b90600052602060002001549050919050565b611041611992565b73ffffffffffffffffffffffffffffffffffffffff1661105f6112c1565b73ffffffffffffffffffffffffffffffffffffffff16146110b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ac906135cc565b60405180910390fd5b80600e90805190602001906110cb92919061291c565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116f9061352c565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e99061350c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611241611992565b73ffffffffffffffffffffffffffffffffffffffff1661125f6112c1565b73ffffffffffffffffffffffffffffffffffffffff16146112b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ac906135cc565b60405180910390fd5b6112bf6000611dab565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546112fa9061399a565b80601f01602080910402602001604051908101604052809291908181526020018280546113269061399a565b80156113735780601f1061134857610100808354040283529160200191611373565b820191906000526020600020905b81548152906001019060200180831161135657829003601f168201915b5050505050905090565b611385611992565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ea906134ac565b60405180910390fd5b8060056000611400611992565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114ad611992565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114f291906133cf565b60405180910390a35050565b61150f611509611992565b83611a71565b61154e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115459061366c565b60405180910390fd5b61155a84848484611e71565b50505050565b606061156b82611926565b6115aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a19061362c565b60405180910390fd5b60006115b4611ecd565b905060008151116115d457604051806020016040528060008152506115ff565b806115de84611f5f565b6040516020016115ef929190613344565b6040516020818303038152906040525b915050919050565b61160f611992565b73ffffffffffffffffffffffffffffffffffffffff1661162d6112c1565b73ffffffffffffffffffffffffffffffffffffffff1614611683576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167a906135cc565b60405180910390fd5b6000600d60006101000a81548160ff021916908315150217905550565b7316658dba4856b698fadaed8e6096e975e0040ab281565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611754611992565b73ffffffffffffffffffffffffffffffffffffffff166117726112c1565b73ffffffffffffffffffffffffffffffffffffffff16146117c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bf906135cc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611838576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182f9061344c565b60405180910390fd5b61184181611dab565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061190f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061191f575061191e826120c0565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611a0d836110cf565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611a6d82826040518060200160405280600081525061212a565b5050565b6000611a7c82611926565b611abb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab2906134cc565b60405180910390fd5b6000611ac6836110cf565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611b3557508373ffffffffffffffffffffffffffffffffffffffff16611b1d846106bf565b73ffffffffffffffffffffffffffffffffffffffff16145b80611b465750611b4581856116b8565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b6f826110cf565b73ffffffffffffffffffffffffffffffffffffffff1614611bc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbc9061360c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2c9061348c565b60405180910390fd5b611c40838383612185565b611c4b60008261199a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c9b91906138b0565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cf29190613829565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611e7c848484611b4f565b611e8884848484612299565b611ec7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebe9061342c565b60405180910390fd5b50505050565b6060600e8054611edc9061399a565b80601f0160208091040260200160405190810160405280929190818152602001828054611f089061399a565b8015611f555780601f10611f2a57610100808354040283529160200191611f55565b820191906000526020600020905b815481529060010190602001808311611f3857829003601f168201915b5050505050905090565b60606000821415611fa7576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506120bb565b600082905060005b60008214611fd9578080611fc2906139fd565b915050600a82611fd2919061387f565b9150611faf565b60008167ffffffffffffffff811115611ff557611ff4613b62565b5b6040519080825280601f01601f1916602001820160405280156120275781602001600182028036833780820191505090505b5090505b600085146120b45760018261204091906138b0565b9150600a8561204f9190613a46565b603061205b9190613829565b60f81b81838151811061207157612070613b33565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120ad919061387f565b945061202b565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6121348383612430565b6121416000848484612299565b612180576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121779061342c565b60405180910390fd5b505050565b6121908383836125fe565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156121d3576121ce81612603565b612212565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461221157612210838261264c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561225557612250816127b9565b612294565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461229357612292828261288a565b5b5b505050565b60006122ba8473ffffffffffffffffffffffffffffffffffffffff16612909565b15612423578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122e3611992565b8786866040518563ffffffff1660e01b81526004016123059493929190613383565b602060405180830381600087803b15801561231f57600080fd5b505af192505050801561235057506040513d601f19601f8201168201806040525081019061234d9190612eac565b60015b6123d3573d8060008114612380576040519150601f19603f3d011682016040523d82523d6000602084013e612385565b606091505b506000815114156123cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c29061342c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612428565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124979061358c565b60405180910390fd5b6124a981611926565b156124e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e09061346c565b60405180910390fd5b6124f560008383612185565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125459190613829565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161265984611181565b61266391906138b0565b9050600060076000848152602001908152602001600020549050818114612748576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506127cd91906138b0565b90506000600960008481526020019081526020016000205490506000600883815481106127fd576127fc613b33565b5b90600052602060002001549050806008838154811061281f5761281e613b33565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061286e5761286d613b04565b5b6001900381819060005260206000200160009055905550505050565b600061289583611181565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b8280546129289061399a565b90600052602060002090601f01602090048101928261294a5760008555612991565b82601f1061296357805160ff1916838001178555612991565b82800160010185558215612991579182015b82811115612990578251825591602001919060010190612975565b5b50905061299e91906129a2565b5090565b5b808211156129bb5760008160009055506001016129a3565b5090565b60006129d26129cd8461372c565b613707565b905080838252602082019050828560208602820111156129f5576129f4613b96565b5b60005b85811015612a255781612a0b8882612b23565b8452602084019350602083019250506001810190506129f8565b5050509392505050565b6000612a42612a3d84613758565b613707565b90508083825260208201905082856020860282011115612a6557612a64613b96565b5b60005b85811015612a955781612a7b8882612c2f565b845260208401935060208301925050600181019050612a68565b5050509392505050565b6000612ab2612aad84613784565b613707565b905082815260208101848484011115612ace57612acd613b9b565b5b612ad9848285613958565b509392505050565b6000612af4612aef846137b5565b613707565b905082815260208101848484011115612b1057612b0f613b9b565b5b612b1b848285613958565b509392505050565b600081359050612b3281614216565b92915050565b600082601f830112612b4d57612b4c613b91565b5b8135612b5d8482602086016129bf565b91505092915050565b600082601f830112612b7b57612b7a613b91565b5b8135612b8b848260208601612a2f565b91505092915050565b600081359050612ba38161422d565b92915050565b600081359050612bb881614244565b92915050565b600081519050612bcd81614244565b92915050565b600082601f830112612be857612be7613b91565b5b8135612bf8848260208601612a9f565b91505092915050565b600082601f830112612c1657612c15613b91565b5b8135612c26848260208601612ae1565b91505092915050565b600081359050612c3e8161425b565b92915050565b600060208284031215612c5a57612c59613ba5565b5b6000612c6884828501612b23565b91505092915050565b60008060408385031215612c8857612c87613ba5565b5b6000612c9685828601612b23565b9250506020612ca785828601612b23565b9150509250929050565b600080600060608486031215612cca57612cc9613ba5565b5b6000612cd886828701612b23565b9350506020612ce986828701612b23565b9250506040612cfa86828701612c2f565b9150509250925092565b60008060008060808587031215612d1e57612d1d613ba5565b5b6000612d2c87828801612b23565b9450506020612d3d87828801612b23565b9350506040612d4e87828801612c2f565b925050606085013567ffffffffffffffff811115612d6f57612d6e613ba0565b5b612d7b87828801612bd3565b91505092959194509250565b60008060408385031215612d9e57612d9d613ba5565b5b6000612dac85828601612b23565b9250506020612dbd85828601612b94565b9150509250929050565b60008060408385031215612dde57612ddd613ba5565b5b6000612dec85828601612b23565b9250506020612dfd85828601612c2f565b9150509250929050565b60008060408385031215612e1e57612e1d613ba5565b5b600083013567ffffffffffffffff811115612e3c57612e3b613ba0565b5b612e4885828601612b38565b925050602083013567ffffffffffffffff811115612e6957612e68613ba0565b5b612e7585828601612b66565b9150509250929050565b600060208284031215612e9557612e94613ba5565b5b6000612ea384828501612ba9565b91505092915050565b600060208284031215612ec257612ec1613ba5565b5b6000612ed084828501612bbe565b91505092915050565b600060208284031215612eef57612eee613ba5565b5b600082013567ffffffffffffffff811115612f0d57612f0c613ba0565b5b612f1984828501612c01565b91505092915050565b600060208284031215612f3857612f37613ba5565b5b6000612f4684828501612c2f565b91505092915050565b612f58816138e4565b82525050565b612f67816138f6565b82525050565b6000612f78826137e6565b612f8281856137fc565b9350612f92818560208601613967565b612f9b81613baa565b840191505092915050565b6000612fb1826137f1565b612fbb818561380d565b9350612fcb818560208601613967565b612fd481613baa565b840191505092915050565b6000612fea826137f1565b612ff4818561381e565b9350613004818560208601613967565b80840191505092915050565b600061301d602b8361380d565b915061302882613bbb565b604082019050919050565b600061304060328361380d565b915061304b82613c0a565b604082019050919050565b600061306360268361380d565b915061306e82613c59565b604082019050919050565b6000613086601c8361380d565b915061309182613ca8565b602082019050919050565b60006130a960248361380d565b91506130b482613cd1565b604082019050919050565b60006130cc60198361380d565b91506130d782613d20565b602082019050919050565b60006130ef602c8361380d565b91506130fa82613d49565b604082019050919050565b600061311260388361380d565b915061311d82613d98565b604082019050919050565b6000613135602a8361380d565b915061314082613de7565b604082019050919050565b600061315860298361380d565b915061316382613e36565b604082019050919050565b600061317b602b8361380d565b915061318682613e85565b604082019050919050565b600061319e60228361380d565b91506131a982613ed4565b604082019050919050565b60006131c160208361380d565b91506131cc82613f23565b602082019050919050565b60006131e4602c8361380d565b91506131ef82613f4c565b604082019050919050565b600061320760208361380d565b915061321282613f9b565b602082019050919050565b600061322a60258361380d565b915061323582613fc4565b604082019050919050565b600061324d60298361380d565b915061325882614013565b604082019050919050565b6000613270602f8361380d565b915061327b82614062565b604082019050919050565b600061329360218361380d565b915061329e826140b1565b604082019050919050565b60006132b660318361380d565b91506132c182614100565b604082019050919050565b60006132d9602c8361380d565b91506132e48261414f565b604082019050919050565b60006132fc60168361380d565b91506133078261419e565b602082019050919050565b600061331f60308361380d565b915061332a826141c7565b604082019050919050565b61333e8161394e565b82525050565b60006133508285612fdf565b915061335c8284612fdf565b91508190509392505050565b600060208201905061337d6000830184612f4f565b92915050565b60006080820190506133986000830187612f4f565b6133a56020830186612f4f565b6133b26040830185613335565b81810360608301526133c48184612f6d565b905095945050505050565b60006020820190506133e46000830184612f5e565b92915050565b600060208201905081810360008301526134048184612fa6565b905092915050565b6000602082019050818103600083015261342581613010565b9050919050565b6000602082019050818103600083015261344581613033565b9050919050565b6000602082019050818103600083015261346581613056565b9050919050565b6000602082019050818103600083015261348581613079565b9050919050565b600060208201905081810360008301526134a58161309c565b9050919050565b600060208201905081810360008301526134c5816130bf565b9050919050565b600060208201905081810360008301526134e5816130e2565b9050919050565b6000602082019050818103600083015261350581613105565b9050919050565b6000602082019050818103600083015261352581613128565b9050919050565b600060208201905081810360008301526135458161314b565b9050919050565b600060208201905081810360008301526135658161316e565b9050919050565b6000602082019050818103600083015261358581613191565b9050919050565b600060208201905081810360008301526135a5816131b4565b9050919050565b600060208201905081810360008301526135c5816131d7565b9050919050565b600060208201905081810360008301526135e5816131fa565b9050919050565b600060208201905081810360008301526136058161321d565b9050919050565b6000602082019050818103600083015261362581613240565b9050919050565b6000602082019050818103600083015261364581613263565b9050919050565b6000602082019050818103600083015261366581613286565b9050919050565b60006020820190508181036000830152613685816132a9565b9050919050565b600060208201905081810360008301526136a5816132cc565b9050919050565b600060208201905081810360008301526136c5816132ef565b9050919050565b600060208201905081810360008301526136e581613312565b9050919050565b60006020820190506137016000830184613335565b92915050565b6000613711613722565b905061371d82826139cc565b919050565b6000604051905090565b600067ffffffffffffffff82111561374757613746613b62565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561377357613772613b62565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561379f5761379e613b62565b5b6137a882613baa565b9050602081019050919050565b600067ffffffffffffffff8211156137d0576137cf613b62565b5b6137d982613baa565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006138348261394e565b915061383f8361394e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561387457613873613a77565b5b828201905092915050565b600061388a8261394e565b91506138958361394e565b9250826138a5576138a4613aa6565b5b828204905092915050565b60006138bb8261394e565b91506138c68361394e565b9250828210156138d9576138d8613a77565b5b828203905092915050565b60006138ef8261392e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561398557808201518184015260208101905061396a565b83811115613994576000848401525b50505050565b600060028204905060018216806139b257607f821691505b602082108114156139c6576139c5613ad5565b5b50919050565b6139d582613baa565b810181811067ffffffffffffffff821117156139f4576139f3613b62565b5b80604052505050565b6000613a088261394e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613a3b57613a3a613a77565b5b600182019050919050565b6000613a518261394e565b9150613a5c8361394e565b925082613a6c57613a6b613aa6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f5069676769652050616c7a2049442073686f756c64206265206265747765656e60008201527f203120616e64203430302e000000000000000000000000000000000000000000602082015250565b7f546869732050696767696520646f65736e27742062656c6f6e6720746f20796f60008201527f7521000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5a6f6d626965205069676769652050616c7a2061726520616c7265616479206160008201527f77616b6521000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f50696767696520616c7265616479206d696e7465642e00000000000000000000600082015250565b7f5a6f6d626965205069676769652050616c7a2068617665206e6f74207269736560008201527f6e2066726f6d2074686520646561642100000000000000000000000000000000602082015250565b61421f816138e4565b811461422a57600080fd5b50565b614236816138f6565b811461424157600080fd5b50565b61424d81613902565b811461425857600080fd5b50565b6142648161394e565b811461426f57600080fd5b5056fea2646970667358221220c08cf39dfb374509ad20ccd0afd26a8c0406d2ab9a9bf0050ad130ce472097fa64736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d534e323934677a614c744d316d6a4a34774d44516455346a6a345953376b376e6a46317a415a50756d3678622f00000000000000000000
-----Decoded View---------------
Arg [0] : baseURI (string): ipfs://QmSN294gzaLtM1mjJ4wMDQdU4jj4YS7k7njF1zAZPum6xb/
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [2] : 697066733a2f2f516d534e323934677a614c744d316d6a4a34774d4451645534
Arg [3] : 6a6a345953376b376e6a46317a415a50756d3678622f00000000000000000000
Deployed Bytecode Sourcemap
51609:2368:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45334:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33226:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34785:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34308:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52671:414;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53326:134;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45974:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35675:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52046:22;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52422:148;;;:::i;:::-;;53097:217;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45642:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53614:114;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51960:79;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36085:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53472:130;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46164:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53865:101;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32920:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32650:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12925:94;;;:::i;:::-;;12274:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33395:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35078:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36341:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33570:334;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52582:77;;;:::i;:::-;;51870:83;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35444:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13174:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45334:224;45436:4;45475:35;45460:50;;;:11;:50;;;;:90;;;;45514:36;45538:11;45514:23;:36::i;:::-;45460:90;45453:97;;45334:224;;;:::o;33226:100::-;33280:13;33313:5;33306:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33226:100;:::o;34785:221::-;34861:7;34889:16;34897:7;34889;:16::i;:::-;34881:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34974:15;:24;34990:7;34974:24;;;;;;;;;;;;;;;;;;;;;34967:31;;34785:221;;;:::o;34308:411::-;34389:13;34405:23;34420:7;34405:14;:23::i;:::-;34389:39;;34453:5;34447:11;;:2;:11;;;;34439:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;34547:5;34531:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;34556:37;34573:5;34580:12;:10;:12::i;:::-;34556:16;:37::i;:::-;34531:62;34509:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;34690:21;34699:2;34703:7;34690:8;:21::i;:::-;34378:341;34308:411;;:::o;52671:414::-;52327:10;;;;;;;;;;;52319:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;52769:1:::1;52752:6;:13;52759:5;52752:13;;;;;;;;;;;;;;;;;;;;;:18;;;;52744:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;52824:1;52816:5;:9;:24;;;;;52837:3;52829:5;:11;52816:24;52808:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;52931:10;52907:34;;:13;:20;52921:5;52907:20;;;;;;;;;;;;;;;;;;;;;:34;;;52899:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;53007:1;52991:6;:13;52998:5;52991:13;;;;;;;;;;;;:17;;;;;;;;;;;;;;;;;;53019:30;53029:12;:10;:12::i;:::-;53043:5;53019:9;:30::i;:::-;53065:12;53071:5;53065:12;;;;;;:::i;:::-;;;;;;;;52671:414:::0;:::o;53326:134::-;12505:12;:10;:12::i;:::-;12494:23;;:7;:5;:7::i;:::-;:23;;;12486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53448:4:::1;53425:13;:20;53439:5;53425:20;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;53326:134:::0;;:::o;45974:113::-;46035:7;46062:10;:17;;;;46055:24;;45974:113;:::o;35675:339::-;35870:41;35889:12;:10;:12::i;:::-;35903:7;35870:18;:41::i;:::-;35862:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;35978:28;35988:4;35994:2;35998:7;35978:9;:28::i;:::-;35675:339;;;:::o;52046:22::-;;;;;;;;;;;;;:::o;52422:148::-;12505:12;:10;:12::i;:::-;12494:23;;:7;:5;:7::i;:::-;:23;;;12486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52482:10:::1;;;;;;;;;;;52481:11;52473:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;52558:4;52545:10;;:17;;;;;;;;;;;;;;;;;;52422:148::o:0;53097:217::-;12505:12;:10;:12::i;:::-;12494:23;;:7;:5;:7::i;:::-;:23;;;12486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53210:6:::1;53205:102;53226:5;:12;53222:1;:16;53205:102;;;53287:5;53293:1;53287:8;;;;;;;;:::i;:::-;;;;;;;;53260:13;:24;53274:6;53281:1;53274:9;;;;;;;;:::i;:::-;;;;;;;;53260:24;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;53240:3;;;;;:::i;:::-;;;;53205:102;;;;53097:217:::0;;:::o;45642:256::-;45739:7;45775:23;45792:5;45775:16;:23::i;:::-;45767:5;:31;45759:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;45864:12;:19;45877:5;45864:19;;;;;;;;;;;;;;;:26;45884:5;45864:26;;;;;;;;;;;;45857:33;;45642:256;;;;:::o;53614:114::-;12505:12;:10;:12::i;:::-;12494:23;;:7;:5;:7::i;:::-;:23;;;12486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53718:1:::1;53687:13;:20;53701:5;53687:20;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;53614:114:::0;:::o;51960:79::-;51997:42;51960:79;:::o;36085:185::-;36223:39;36240:4;36246:2;36250:7;36223:39;;;;;;;;;;;;:16;:39::i;:::-;36085:185;;;:::o;53472:130::-;53547:7;53574:13;:20;53588:5;53574:20;;;;;;;;;;;;;;;;;;;;;53567:27;;53472:130;;;:::o;46164:233::-;46239:7;46275:30;:28;:30::i;:::-;46267:5;:38;46259:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;46372:10;46383:5;46372:17;;;;;;;;:::i;:::-;;;;;;;;;;46365:24;;46164:233;;;:::o;53865:101::-;12505:12;:10;:12::i;:::-;12494:23;;:7;:5;:7::i;:::-;:23;;;12486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53951:7:::1;53936:12;:22;;;;;;;;;;;;:::i;:::-;;53865:101:::0;:::o;32920:239::-;32992:7;33012:13;33028:7;:16;33036:7;33028:16;;;;;;;;;;;;;;;;;;;;;33012:32;;33080:1;33063:19;;:5;:19;;;;33055:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33146:5;33139:12;;;32920:239;;;:::o;32650:208::-;32722:7;32767:1;32750:19;;:5;:19;;;;32742:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;32834:9;:16;32844:5;32834:16;;;;;;;;;;;;;;;;32827:23;;32650:208;;;:::o;12925:94::-;12505:12;:10;:12::i;:::-;12494:23;;:7;:5;:7::i;:::-;:23;;;12486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12990:21:::1;13008:1;12990:9;:21::i;:::-;12925:94::o:0;12274:87::-;12320:7;12347:6;;;;;;;;;;;12340:13;;12274:87;:::o;33395:104::-;33451:13;33484:7;33477:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33395:104;:::o;35078:295::-;35193:12;:10;:12::i;:::-;35181:24;;:8;:24;;;;35173:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;35293:8;35248:18;:32;35267:12;:10;:12::i;:::-;35248:32;;;;;;;;;;;;;;;:42;35281:8;35248:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;35346:8;35317:48;;35332:12;:10;:12::i;:::-;35317:48;;;35356:8;35317:48;;;;;;:::i;:::-;;;;;;;;35078:295;;:::o;36341:328::-;36516:41;36535:12;:10;:12::i;:::-;36549:7;36516:18;:41::i;:::-;36508:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;36622:39;36636:4;36642:2;36646:7;36655:5;36622:13;:39::i;:::-;36341:328;;;;:::o;33570:334::-;33643:13;33677:16;33685:7;33677;:16::i;:::-;33669:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;33758:21;33782:10;:8;:10::i;:::-;33758:34;;33834:1;33816:7;33810:21;:25;:86;;;;;;;;;;;;;;;;;33862:7;33871:18;:7;:16;:18::i;:::-;33845:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33810:86;33803:93;;;33570:334;;;:::o;52582:77::-;12505:12;:10;:12::i;:::-;12494:23;;:7;:5;:7::i;:::-;:23;;;12486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52646:5:::1;52633:10;;:18;;;;;;;;;;;;;;;;;;52582:77::o:0;51870:83::-;51911:42;51870:83;:::o;35444:164::-;35541:4;35565:18;:25;35584:5;35565:25;;;;;;;;;;;;;;;:35;35591:8;35565:35;;;;;;;;;;;;;;;;;;;;;;;;;35558:42;;35444:164;;;;:::o;13174:192::-;12505:12;:10;:12::i;:::-;12494:23;;:7;:5;:7::i;:::-;:23;;;12486:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13283:1:::1;13263:22;;:8;:22;;;;13255:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;13339:19;13349:8;13339:9;:19::i;:::-;13174:192:::0;:::o;32281:305::-;32383:4;32435:25;32420:40;;;:11;:40;;;;:105;;;;32492:33;32477:48;;;:11;:48;;;;32420:105;:158;;;;32542:36;32566:11;32542:23;:36::i;:::-;32420:158;32400:178;;32281:305;;;:::o;38179:127::-;38244:4;38296:1;38268:30;;:7;:16;38276:7;38268:16;;;;;;;;;;;;;;;;;;;;;:30;;;;38261:37;;38179:127;;;:::o;11062:98::-;11115:7;11142:10;11135:17;;11062:98;:::o;42161:174::-;42263:2;42236:15;:24;42252:7;42236:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;42319:7;42315:2;42281:46;;42290:23;42305:7;42290:14;:23::i;:::-;42281:46;;;;;;;;;;;;42161:174;;:::o;39163:110::-;39239:26;39249:2;39253:7;39239:26;;;;;;;;;;;;:9;:26::i;:::-;39163:110;;:::o;38473:348::-;38566:4;38591:16;38599:7;38591;:16::i;:::-;38583:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;38667:13;38683:23;38698:7;38683:14;:23::i;:::-;38667:39;;38736:5;38725:16;;:7;:16;;;:51;;;;38769:7;38745:31;;:20;38757:7;38745:11;:20::i;:::-;:31;;;38725:51;:87;;;;38780:32;38797:5;38804:7;38780:16;:32::i;:::-;38725:87;38717:96;;;38473:348;;;;:::o;41465:578::-;41624:4;41597:31;;:23;41612:7;41597:14;:23::i;:::-;:31;;;41589:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;41707:1;41693:16;;:2;:16;;;;41685:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;41763:39;41784:4;41790:2;41794:7;41763:20;:39::i;:::-;41867:29;41884:1;41888:7;41867:8;:29::i;:::-;41928:1;41909:9;:15;41919:4;41909:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;41957:1;41940:9;:13;41950:2;41940:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;41988:2;41969:7;:16;41977:7;41969:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;42027:7;42023:2;42008:27;;42017:4;42008:27;;;;;;;;;;;;41465:578;;;:::o;13374:173::-;13430:16;13449:6;;;;;;;;;;;13430:25;;13475:8;13466:6;;:17;;;;;;;;;;;;;;;;;;13530:8;13499:40;;13520:8;13499:40;;;;;;;;;;;;13419:128;13374:173;:::o;37551:315::-;37708:28;37718:4;37724:2;37728:7;37708:9;:28::i;:::-;37755:48;37778:4;37784:2;37788:7;37797:5;37755:22;:48::i;:::-;37747:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;37551:315;;;;:::o;53740:113::-;53800:13;53833:12;53826:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53740:113;:::o;8678:723::-;8734:13;8964:1;8955:5;:10;8951:53;;;8982:10;;;;;;;;;;;;;;;;;;;;;8951:53;9014:12;9029:5;9014:20;;9045:14;9070:78;9085:1;9077:4;:9;9070:78;;9103:8;;;;;:::i;:::-;;;;9134:2;9126:10;;;;;:::i;:::-;;;9070:78;;;9158:19;9190:6;9180:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9158:39;;9208:154;9224:1;9215:5;:10;9208:154;;9252:1;9242:11;;;;;:::i;:::-;;;9319:2;9311:5;:10;;;;:::i;:::-;9298:2;:24;;;;:::i;:::-;9285:39;;9268:6;9275;9268:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;9348:2;9339:11;;;;;:::i;:::-;;;9208:154;;;9386:6;9372:21;;;;;8678:723;;;;:::o;24260:157::-;24345:4;24384:25;24369:40;;;:11;:40;;;;24362:47;;24260:157;;;:::o;39500:321::-;39630:18;39636:2;39640:7;39630:5;:18::i;:::-;39681:54;39712:1;39716:2;39720:7;39729:5;39681:22;:54::i;:::-;39659:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;39500:321;;;:::o;47010:589::-;47154:45;47181:4;47187:2;47191:7;47154:26;:45::i;:::-;47232:1;47216:18;;:4;:18;;;47212:187;;;47251:40;47283:7;47251:31;:40::i;:::-;47212:187;;;47321:2;47313:10;;:4;:10;;;47309:90;;47340:47;47373:4;47379:7;47340:32;:47::i;:::-;47309:90;47212:187;47427:1;47413:16;;:2;:16;;;47409:183;;;47446:45;47483:7;47446:36;:45::i;:::-;47409:183;;;47519:4;47513:10;;:2;:10;;;47509:83;;47540:40;47568:2;47572:7;47540:27;:40::i;:::-;47509:83;47409:183;47010:589;;;:::o;42900:799::-;43055:4;43076:15;:2;:13;;;:15::i;:::-;43072:620;;;43128:2;43112:36;;;43149:12;:10;:12::i;:::-;43163:4;43169:7;43178:5;43112:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;43108:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43371:1;43354:6;:13;:18;43350:272;;;43397:60;;;;;;;;;;:::i;:::-;;;;;;;;43350:272;43572:6;43566:13;43557:6;43553:2;43549:15;43542:38;43108:529;43245:41;;;43235:51;;;:6;:51;;;;43228:58;;;;;43072:620;43676:4;43669:11;;42900:799;;;;;;;:::o;40157:382::-;40251:1;40237:16;;:2;:16;;;;40229:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;40310:16;40318:7;40310;:16::i;:::-;40309:17;40301:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;40372:45;40401:1;40405:2;40409:7;40372:20;:45::i;:::-;40447:1;40430:9;:13;40440:2;40430:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;40478:2;40459:7;:16;40467:7;40459:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;40523:7;40519:2;40498:33;;40515:1;40498:33;;;;;;;;;;;;40157:382;;:::o;44271:126::-;;;;:::o;48322:164::-;48426:10;:17;;;;48399:15;:24;48415:7;48399:24;;;;;;;;;;;:44;;;;48454:10;48470:7;48454:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48322:164;:::o;49113:988::-;49379:22;49429:1;49404:22;49421:4;49404:16;:22::i;:::-;:26;;;;:::i;:::-;49379:51;;49441:18;49462:17;:26;49480:7;49462:26;;;;;;;;;;;;49441:47;;49609:14;49595:10;:28;49591:328;;49640:19;49662:12;:18;49675:4;49662:18;;;;;;;;;;;;;;;:34;49681:14;49662:34;;;;;;;;;;;;49640:56;;49746:11;49713:12;:18;49726:4;49713:18;;;;;;;;;;;;;;;:30;49732:10;49713:30;;;;;;;;;;;:44;;;;49863:10;49830:17;:30;49848:11;49830:30;;;;;;;;;;;:43;;;;49625:294;49591:328;50015:17;:26;50033:7;50015:26;;;;;;;;;;;50008:33;;;50059:12;:18;50072:4;50059:18;;;;;;;;;;;;;;;:34;50078:14;50059:34;;;;;;;;;;;50052:41;;;49194:907;;49113:988;;:::o;50396:1079::-;50649:22;50694:1;50674:10;:17;;;;:21;;;;:::i;:::-;50649:46;;50706:18;50727:15;:24;50743:7;50727:24;;;;;;;;;;;;50706:45;;51078:19;51100:10;51111:14;51100:26;;;;;;;;:::i;:::-;;;;;;;;;;51078:48;;51164:11;51139:10;51150;51139:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;51275:10;51244:15;:28;51260:11;51244:28;;;;;;;;;;;:41;;;;51416:15;:24;51432:7;51416:24;;;;;;;;;;;51409:31;;;51451:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;50467:1008;;;50396:1079;:::o;47900:221::-;47985:14;48002:20;48019:2;48002:16;:20::i;:::-;47985:37;;48060:7;48033:12;:16;48046:2;48033:16;;;;;;;;;;;;;;;:24;48050:6;48033:24;;;;;;;;;;;:34;;;;48107:6;48078:17;:26;48096:7;48078:26;;;;;;;;;;;:35;;;;47974:147;47900:221;;:::o;14320:387::-;14380:4;14588:12;14655:7;14643:20;14635:28;;14698:1;14691:4;:8;14684:15;;;14320:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:410::-;1574:5;1599:65;1615:48;1656:6;1615:48;:::i;:::-;1599:65;:::i;:::-;1590:74;;1687:6;1680:5;1673:21;1725:4;1718:5;1714:16;1763:3;1754:6;1749:3;1745:16;1742:25;1739:112;;;1770:79;;:::i;:::-;1739:112;1860:41;1894:6;1889:3;1884;1860:41;:::i;:::-;1580:327;1497:410;;;;;:::o;1913:412::-;1991:5;2016:66;2032:49;2074:6;2032:49;:::i;:::-;2016:66;:::i;:::-;2007:75;;2105:6;2098:5;2091:21;2143:4;2136:5;2132:16;2181:3;2172:6;2167:3;2163:16;2160:25;2157:112;;;2188:79;;:::i;:::-;2157:112;2278:41;2312:6;2307:3;2302;2278:41;:::i;:::-;1997:328;1913:412;;;;;:::o;2331:139::-;2377:5;2415:6;2402:20;2393:29;;2431:33;2458:5;2431:33;:::i;:::-;2331:139;;;;:::o;2493:370::-;2564:5;2613:3;2606:4;2598:6;2594:17;2590:27;2580:122;;2621:79;;:::i;:::-;2580:122;2738:6;2725:20;2763:94;2853:3;2845:6;2838:4;2830:6;2826:17;2763:94;:::i;:::-;2754:103;;2570:293;2493:370;;;;:::o;2886:::-;2957:5;3006:3;2999:4;2991:6;2987:17;2983:27;2973:122;;3014:79;;:::i;:::-;2973:122;3131:6;3118:20;3156:94;3246:3;3238:6;3231:4;3223:6;3219:17;3156:94;:::i;:::-;3147:103;;2963:293;2886:370;;;;:::o;3262:133::-;3305:5;3343:6;3330:20;3321:29;;3359:30;3383:5;3359:30;:::i;:::-;3262:133;;;;:::o;3401:137::-;3446:5;3484:6;3471:20;3462:29;;3500:32;3526:5;3500:32;:::i;:::-;3401:137;;;;:::o;3544:141::-;3600:5;3631:6;3625:13;3616:22;;3647:32;3673:5;3647:32;:::i;:::-;3544:141;;;;:::o;3704:338::-;3759:5;3808:3;3801:4;3793:6;3789:17;3785:27;3775:122;;3816:79;;:::i;:::-;3775:122;3933:6;3920:20;3958:78;4032:3;4024:6;4017:4;4009:6;4005:17;3958:78;:::i;:::-;3949:87;;3765:277;3704:338;;;;:::o;4062:340::-;4118:5;4167:3;4160:4;4152:6;4148:17;4144:27;4134:122;;4175:79;;:::i;:::-;4134:122;4292:6;4279:20;4317:79;4392:3;4384:6;4377:4;4369:6;4365:17;4317:79;:::i;:::-;4308:88;;4124:278;4062:340;;;;:::o;4408:139::-;4454:5;4492:6;4479:20;4470:29;;4508:33;4535:5;4508:33;:::i;:::-;4408:139;;;;:::o;4553:329::-;4612:6;4661:2;4649:9;4640:7;4636:23;4632:32;4629:119;;;4667:79;;:::i;:::-;4629:119;4787:1;4812:53;4857:7;4848:6;4837:9;4833:22;4812:53;:::i;:::-;4802:63;;4758:117;4553:329;;;;:::o;4888:474::-;4956:6;4964;5013:2;5001:9;4992:7;4988:23;4984:32;4981:119;;;5019:79;;:::i;:::-;4981:119;5139:1;5164:53;5209:7;5200:6;5189:9;5185:22;5164:53;:::i;:::-;5154:63;;5110:117;5266:2;5292:53;5337:7;5328:6;5317:9;5313:22;5292:53;:::i;:::-;5282:63;;5237:118;4888:474;;;;;:::o;5368:619::-;5445:6;5453;5461;5510:2;5498:9;5489:7;5485:23;5481:32;5478:119;;;5516:79;;:::i;:::-;5478:119;5636:1;5661:53;5706:7;5697:6;5686:9;5682:22;5661:53;:::i;:::-;5651:63;;5607:117;5763:2;5789:53;5834:7;5825:6;5814:9;5810:22;5789:53;:::i;:::-;5779:63;;5734:118;5891:2;5917:53;5962:7;5953:6;5942:9;5938:22;5917:53;:::i;:::-;5907:63;;5862:118;5368:619;;;;;:::o;5993:943::-;6088:6;6096;6104;6112;6161:3;6149:9;6140:7;6136:23;6132:33;6129:120;;;6168:79;;:::i;:::-;6129:120;6288:1;6313:53;6358:7;6349:6;6338:9;6334:22;6313:53;:::i;:::-;6303:63;;6259:117;6415:2;6441:53;6486:7;6477:6;6466:9;6462:22;6441:53;:::i;:::-;6431:63;;6386:118;6543:2;6569:53;6614:7;6605:6;6594:9;6590:22;6569:53;:::i;:::-;6559:63;;6514:118;6699:2;6688:9;6684:18;6671:32;6730:18;6722:6;6719:30;6716:117;;;6752:79;;:::i;:::-;6716:117;6857:62;6911:7;6902:6;6891:9;6887:22;6857:62;:::i;:::-;6847:72;;6642:287;5993:943;;;;;;;:::o;6942:468::-;7007:6;7015;7064:2;7052:9;7043:7;7039:23;7035:32;7032:119;;;7070:79;;:::i;:::-;7032:119;7190:1;7215:53;7260:7;7251:6;7240:9;7236:22;7215:53;:::i;:::-;7205:63;;7161:117;7317:2;7343:50;7385:7;7376:6;7365:9;7361:22;7343:50;:::i;:::-;7333:60;;7288:115;6942:468;;;;;:::o;7416:474::-;7484:6;7492;7541:2;7529:9;7520:7;7516:23;7512:32;7509:119;;;7547:79;;:::i;:::-;7509:119;7667:1;7692:53;7737:7;7728:6;7717:9;7713:22;7692:53;:::i;:::-;7682:63;;7638:117;7794:2;7820:53;7865:7;7856:6;7845:9;7841:22;7820:53;:::i;:::-;7810:63;;7765:118;7416:474;;;;;:::o;7896:894::-;8014:6;8022;8071:2;8059:9;8050:7;8046:23;8042:32;8039:119;;;8077:79;;:::i;:::-;8039:119;8225:1;8214:9;8210:17;8197:31;8255:18;8247:6;8244:30;8241:117;;;8277:79;;:::i;:::-;8241:117;8382:78;8452:7;8443:6;8432:9;8428:22;8382:78;:::i;:::-;8372:88;;8168:302;8537:2;8526:9;8522:18;8509:32;8568:18;8560:6;8557:30;8554:117;;;8590:79;;:::i;:::-;8554:117;8695:78;8765:7;8756:6;8745:9;8741:22;8695:78;:::i;:::-;8685:88;;8480:303;7896:894;;;;;:::o;8796:327::-;8854:6;8903:2;8891:9;8882:7;8878:23;8874:32;8871:119;;;8909:79;;:::i;:::-;8871:119;9029:1;9054:52;9098:7;9089:6;9078:9;9074:22;9054:52;:::i;:::-;9044:62;;9000:116;8796:327;;;;:::o;9129:349::-;9198:6;9247:2;9235:9;9226:7;9222:23;9218:32;9215:119;;;9253:79;;:::i;:::-;9215:119;9373:1;9398:63;9453:7;9444:6;9433:9;9429:22;9398:63;:::i;:::-;9388:73;;9344:127;9129:349;;;;:::o;9484:509::-;9553:6;9602:2;9590:9;9581:7;9577:23;9573:32;9570:119;;;9608:79;;:::i;:::-;9570:119;9756:1;9745:9;9741:17;9728:31;9786:18;9778:6;9775:30;9772:117;;;9808:79;;:::i;:::-;9772:117;9913:63;9968:7;9959:6;9948:9;9944:22;9913:63;:::i;:::-;9903:73;;9699:287;9484:509;;;;:::o;9999:329::-;10058:6;10107:2;10095:9;10086:7;10082:23;10078:32;10075:119;;;10113:79;;:::i;:::-;10075:119;10233:1;10258:53;10303:7;10294:6;10283:9;10279:22;10258:53;:::i;:::-;10248:63;;10204:117;9999:329;;;;:::o;10334:118::-;10421:24;10439:5;10421:24;:::i;:::-;10416:3;10409:37;10334:118;;:::o;10458:109::-;10539:21;10554:5;10539:21;:::i;:::-;10534:3;10527:34;10458:109;;:::o;10573:360::-;10659:3;10687:38;10719:5;10687:38;:::i;:::-;10741:70;10804:6;10799:3;10741:70;:::i;:::-;10734:77;;10820:52;10865:6;10860:3;10853:4;10846:5;10842:16;10820:52;:::i;:::-;10897:29;10919:6;10897:29;:::i;:::-;10892:3;10888:39;10881:46;;10663:270;10573:360;;;;:::o;10939:364::-;11027:3;11055:39;11088:5;11055:39;:::i;:::-;11110:71;11174:6;11169:3;11110:71;:::i;:::-;11103:78;;11190:52;11235:6;11230:3;11223:4;11216:5;11212:16;11190:52;:::i;:::-;11267:29;11289:6;11267:29;:::i;:::-;11262:3;11258:39;11251:46;;11031:272;10939:364;;;;:::o;11309:377::-;11415:3;11443:39;11476:5;11443:39;:::i;:::-;11498:89;11580:6;11575:3;11498:89;:::i;:::-;11491:96;;11596:52;11641:6;11636:3;11629:4;11622:5;11618:16;11596:52;:::i;:::-;11673:6;11668:3;11664:16;11657:23;;11419:267;11309:377;;;;:::o;11692:366::-;11834:3;11855:67;11919:2;11914:3;11855:67;:::i;:::-;11848:74;;11931:93;12020:3;11931:93;:::i;:::-;12049:2;12044:3;12040:12;12033:19;;11692:366;;;:::o;12064:::-;12206:3;12227:67;12291:2;12286:3;12227:67;:::i;:::-;12220:74;;12303:93;12392:3;12303:93;:::i;:::-;12421:2;12416:3;12412:12;12405:19;;12064:366;;;:::o;12436:::-;12578:3;12599:67;12663:2;12658:3;12599:67;:::i;:::-;12592:74;;12675:93;12764:3;12675:93;:::i;:::-;12793:2;12788:3;12784:12;12777:19;;12436:366;;;:::o;12808:::-;12950:3;12971:67;13035:2;13030:3;12971:67;:::i;:::-;12964:74;;13047:93;13136:3;13047:93;:::i;:::-;13165:2;13160:3;13156:12;13149:19;;12808:366;;;:::o;13180:::-;13322:3;13343:67;13407:2;13402:3;13343:67;:::i;:::-;13336:74;;13419:93;13508:3;13419:93;:::i;:::-;13537:2;13532:3;13528:12;13521:19;;13180:366;;;:::o;13552:::-;13694:3;13715:67;13779:2;13774:3;13715:67;:::i;:::-;13708:74;;13791:93;13880:3;13791:93;:::i;:::-;13909:2;13904:3;13900:12;13893:19;;13552:366;;;:::o;13924:::-;14066:3;14087:67;14151:2;14146:3;14087:67;:::i;:::-;14080:74;;14163:93;14252:3;14163:93;:::i;:::-;14281:2;14276:3;14272:12;14265:19;;13924:366;;;:::o;14296:::-;14438:3;14459:67;14523:2;14518:3;14459:67;:::i;:::-;14452:74;;14535:93;14624:3;14535:93;:::i;:::-;14653:2;14648:3;14644:12;14637:19;;14296:366;;;:::o;14668:::-;14810:3;14831:67;14895:2;14890:3;14831:67;:::i;:::-;14824:74;;14907:93;14996:3;14907:93;:::i;:::-;15025:2;15020:3;15016:12;15009:19;;14668:366;;;:::o;15040:::-;15182:3;15203:67;15267:2;15262:3;15203:67;:::i;:::-;15196:74;;15279:93;15368:3;15279:93;:::i;:::-;15397:2;15392:3;15388:12;15381:19;;15040:366;;;:::o;15412:::-;15554:3;15575:67;15639:2;15634:3;15575:67;:::i;:::-;15568:74;;15651:93;15740:3;15651:93;:::i;:::-;15769:2;15764:3;15760:12;15753:19;;15412:366;;;:::o;15784:::-;15926:3;15947:67;16011:2;16006:3;15947:67;:::i;:::-;15940:74;;16023:93;16112:3;16023:93;:::i;:::-;16141:2;16136:3;16132:12;16125:19;;15784:366;;;:::o;16156:::-;16298:3;16319:67;16383:2;16378:3;16319:67;:::i;:::-;16312:74;;16395:93;16484:3;16395:93;:::i;:::-;16513:2;16508:3;16504:12;16497:19;;16156:366;;;:::o;16528:::-;16670:3;16691:67;16755:2;16750:3;16691:67;:::i;:::-;16684:74;;16767:93;16856:3;16767:93;:::i;:::-;16885:2;16880:3;16876:12;16869:19;;16528:366;;;:::o;16900:::-;17042:3;17063:67;17127:2;17122:3;17063:67;:::i;:::-;17056:74;;17139:93;17228:3;17139:93;:::i;:::-;17257:2;17252:3;17248:12;17241:19;;16900:366;;;:::o;17272:::-;17414:3;17435:67;17499:2;17494:3;17435:67;:::i;:::-;17428:74;;17511:93;17600:3;17511:93;:::i;:::-;17629:2;17624:3;17620:12;17613:19;;17272:366;;;:::o;17644:::-;17786:3;17807:67;17871:2;17866:3;17807:67;:::i;:::-;17800:74;;17883:93;17972:3;17883:93;:::i;:::-;18001:2;17996:3;17992:12;17985:19;;17644:366;;;:::o;18016:::-;18158:3;18179:67;18243:2;18238:3;18179:67;:::i;:::-;18172:74;;18255:93;18344:3;18255:93;:::i;:::-;18373:2;18368:3;18364:12;18357:19;;18016:366;;;:::o;18388:::-;18530:3;18551:67;18615:2;18610:3;18551:67;:::i;:::-;18544:74;;18627:93;18716:3;18627:93;:::i;:::-;18745:2;18740:3;18736:12;18729:19;;18388:366;;;:::o;18760:::-;18902:3;18923:67;18987:2;18982:3;18923:67;:::i;:::-;18916:74;;18999:93;19088:3;18999:93;:::i;:::-;19117:2;19112:3;19108:12;19101:19;;18760:366;;;:::o;19132:::-;19274:3;19295:67;19359:2;19354:3;19295:67;:::i;:::-;19288:74;;19371:93;19460:3;19371:93;:::i;:::-;19489:2;19484:3;19480:12;19473:19;;19132:366;;;:::o;19504:::-;19646:3;19667:67;19731:2;19726:3;19667:67;:::i;:::-;19660:74;;19743:93;19832:3;19743:93;:::i;:::-;19861:2;19856:3;19852:12;19845:19;;19504:366;;;:::o;19876:::-;20018:3;20039:67;20103:2;20098:3;20039:67;:::i;:::-;20032:74;;20115:93;20204:3;20115:93;:::i;:::-;20233:2;20228:3;20224:12;20217:19;;19876:366;;;:::o;20248:118::-;20335:24;20353:5;20335:24;:::i;:::-;20330:3;20323:37;20248:118;;:::o;20372:435::-;20552:3;20574:95;20665:3;20656:6;20574:95;:::i;:::-;20567:102;;20686:95;20777:3;20768:6;20686:95;:::i;:::-;20679:102;;20798:3;20791:10;;20372:435;;;;;:::o;20813:222::-;20906:4;20944:2;20933:9;20929:18;20921:26;;20957:71;21025:1;21014:9;21010:17;21001:6;20957:71;:::i;:::-;20813:222;;;;:::o;21041:640::-;21236:4;21274:3;21263:9;21259:19;21251:27;;21288:71;21356:1;21345:9;21341:17;21332:6;21288:71;:::i;:::-;21369:72;21437:2;21426:9;21422:18;21413:6;21369:72;:::i;:::-;21451;21519:2;21508:9;21504:18;21495:6;21451:72;:::i;:::-;21570:9;21564:4;21560:20;21555:2;21544:9;21540:18;21533:48;21598:76;21669:4;21660:6;21598:76;:::i;:::-;21590:84;;21041:640;;;;;;;:::o;21687:210::-;21774:4;21812:2;21801:9;21797:18;21789:26;;21825:65;21887:1;21876:9;21872:17;21863:6;21825:65;:::i;:::-;21687:210;;;;:::o;21903:313::-;22016:4;22054:2;22043:9;22039:18;22031:26;;22103:9;22097:4;22093:20;22089:1;22078:9;22074:17;22067:47;22131:78;22204:4;22195:6;22131:78;:::i;:::-;22123:86;;21903:313;;;;:::o;22222:419::-;22388:4;22426:2;22415:9;22411:18;22403:26;;22475:9;22469:4;22465:20;22461:1;22450:9;22446:17;22439:47;22503:131;22629:4;22503:131;:::i;:::-;22495:139;;22222:419;;;:::o;22647:::-;22813:4;22851:2;22840:9;22836:18;22828:26;;22900:9;22894:4;22890:20;22886:1;22875:9;22871:17;22864:47;22928:131;23054:4;22928:131;:::i;:::-;22920:139;;22647:419;;;:::o;23072:::-;23238:4;23276:2;23265:9;23261:18;23253:26;;23325:9;23319:4;23315:20;23311:1;23300:9;23296:17;23289:47;23353:131;23479:4;23353:131;:::i;:::-;23345:139;;23072:419;;;:::o;23497:::-;23663:4;23701:2;23690:9;23686:18;23678:26;;23750:9;23744:4;23740:20;23736:1;23725:9;23721:17;23714:47;23778:131;23904:4;23778:131;:::i;:::-;23770:139;;23497:419;;;:::o;23922:::-;24088:4;24126:2;24115:9;24111:18;24103:26;;24175:9;24169:4;24165:20;24161:1;24150:9;24146:17;24139:47;24203:131;24329:4;24203:131;:::i;:::-;24195:139;;23922:419;;;:::o;24347:::-;24513:4;24551:2;24540:9;24536:18;24528:26;;24600:9;24594:4;24590:20;24586:1;24575:9;24571:17;24564:47;24628:131;24754:4;24628:131;:::i;:::-;24620:139;;24347:419;;;:::o;24772:::-;24938:4;24976:2;24965:9;24961:18;24953:26;;25025:9;25019:4;25015:20;25011:1;25000:9;24996:17;24989:47;25053:131;25179:4;25053:131;:::i;:::-;25045:139;;24772:419;;;:::o;25197:::-;25363:4;25401:2;25390:9;25386:18;25378:26;;25450:9;25444:4;25440:20;25436:1;25425:9;25421:17;25414:47;25478:131;25604:4;25478:131;:::i;:::-;25470:139;;25197:419;;;:::o;25622:::-;25788:4;25826:2;25815:9;25811:18;25803:26;;25875:9;25869:4;25865:20;25861:1;25850:9;25846:17;25839:47;25903:131;26029:4;25903:131;:::i;:::-;25895:139;;25622:419;;;:::o;26047:::-;26213:4;26251:2;26240:9;26236:18;26228:26;;26300:9;26294:4;26290:20;26286:1;26275:9;26271:17;26264:47;26328:131;26454:4;26328:131;:::i;:::-;26320:139;;26047:419;;;:::o;26472:::-;26638:4;26676:2;26665:9;26661:18;26653:26;;26725:9;26719:4;26715:20;26711:1;26700:9;26696:17;26689:47;26753:131;26879:4;26753:131;:::i;:::-;26745:139;;26472:419;;;:::o;26897:::-;27063:4;27101:2;27090:9;27086:18;27078:26;;27150:9;27144:4;27140:20;27136:1;27125:9;27121:17;27114:47;27178:131;27304:4;27178:131;:::i;:::-;27170:139;;26897:419;;;:::o;27322:::-;27488:4;27526:2;27515:9;27511:18;27503:26;;27575:9;27569:4;27565:20;27561:1;27550:9;27546:17;27539:47;27603:131;27729:4;27603:131;:::i;:::-;27595:139;;27322:419;;;:::o;27747:::-;27913:4;27951:2;27940:9;27936:18;27928:26;;28000:9;27994:4;27990:20;27986:1;27975:9;27971:17;27964:47;28028:131;28154:4;28028:131;:::i;:::-;28020:139;;27747:419;;;:::o;28172:::-;28338:4;28376:2;28365:9;28361:18;28353:26;;28425:9;28419:4;28415:20;28411:1;28400:9;28396:17;28389:47;28453:131;28579:4;28453:131;:::i;:::-;28445:139;;28172:419;;;:::o;28597:::-;28763:4;28801:2;28790:9;28786:18;28778:26;;28850:9;28844:4;28840:20;28836:1;28825:9;28821:17;28814:47;28878:131;29004:4;28878:131;:::i;:::-;28870:139;;28597:419;;;:::o;29022:::-;29188:4;29226:2;29215:9;29211:18;29203:26;;29275:9;29269:4;29265:20;29261:1;29250:9;29246:17;29239:47;29303:131;29429:4;29303:131;:::i;:::-;29295:139;;29022:419;;;:::o;29447:::-;29613:4;29651:2;29640:9;29636:18;29628:26;;29700:9;29694:4;29690:20;29686:1;29675:9;29671:17;29664:47;29728:131;29854:4;29728:131;:::i;:::-;29720:139;;29447:419;;;:::o;29872:::-;30038:4;30076:2;30065:9;30061:18;30053:26;;30125:9;30119:4;30115:20;30111:1;30100:9;30096:17;30089:47;30153:131;30279:4;30153:131;:::i;:::-;30145:139;;29872:419;;;:::o;30297:::-;30463:4;30501:2;30490:9;30486:18;30478:26;;30550:9;30544:4;30540:20;30536:1;30525:9;30521:17;30514:47;30578:131;30704:4;30578:131;:::i;:::-;30570:139;;30297:419;;;:::o;30722:::-;30888:4;30926:2;30915:9;30911:18;30903:26;;30975:9;30969:4;30965:20;30961:1;30950:9;30946:17;30939:47;31003:131;31129:4;31003:131;:::i;:::-;30995:139;;30722:419;;;:::o;31147:::-;31313:4;31351:2;31340:9;31336:18;31328:26;;31400:9;31394:4;31390:20;31386:1;31375:9;31371:17;31364:47;31428:131;31554:4;31428:131;:::i;:::-;31420:139;;31147:419;;;:::o;31572:::-;31738:4;31776:2;31765:9;31761:18;31753:26;;31825:9;31819:4;31815:20;31811:1;31800:9;31796:17;31789:47;31853:131;31979:4;31853:131;:::i;:::-;31845:139;;31572:419;;;:::o;31997:222::-;32090:4;32128:2;32117:9;32113:18;32105:26;;32141:71;32209:1;32198:9;32194:17;32185:6;32141:71;:::i;:::-;31997:222;;;;:::o;32225:129::-;32259:6;32286:20;;:::i;:::-;32276:30;;32315:33;32343:4;32335:6;32315:33;:::i;:::-;32225:129;;;:::o;32360:75::-;32393:6;32426:2;32420:9;32410:19;;32360:75;:::o;32441:311::-;32518:4;32608:18;32600:6;32597:30;32594:56;;;32630:18;;:::i;:::-;32594:56;32680:4;32672:6;32668:17;32660:25;;32740:4;32734;32730:15;32722:23;;32441:311;;;:::o;32758:::-;32835:4;32925:18;32917:6;32914:30;32911:56;;;32947:18;;:::i;:::-;32911:56;32997:4;32989:6;32985:17;32977:25;;33057:4;33051;33047:15;33039:23;;32758:311;;;:::o;33075:307::-;33136:4;33226:18;33218:6;33215:30;33212:56;;;33248:18;;:::i;:::-;33212:56;33286:29;33308:6;33286:29;:::i;:::-;33278:37;;33370:4;33364;33360:15;33352:23;;33075:307;;;:::o;33388:308::-;33450:4;33540:18;33532:6;33529:30;33526:56;;;33562:18;;:::i;:::-;33526:56;33600:29;33622:6;33600:29;:::i;:::-;33592:37;;33684:4;33678;33674:15;33666:23;;33388:308;;;:::o;33702:98::-;33753:6;33787:5;33781:12;33771:22;;33702:98;;;:::o;33806:99::-;33858:6;33892:5;33886:12;33876:22;;33806:99;;;:::o;33911:168::-;33994:11;34028:6;34023:3;34016:19;34068:4;34063:3;34059:14;34044:29;;33911:168;;;;:::o;34085:169::-;34169:11;34203:6;34198:3;34191:19;34243:4;34238:3;34234:14;34219:29;;34085:169;;;;:::o;34260:148::-;34362:11;34399:3;34384:18;;34260:148;;;;:::o;34414:305::-;34454:3;34473:20;34491:1;34473:20;:::i;:::-;34468:25;;34507:20;34525:1;34507:20;:::i;:::-;34502:25;;34661:1;34593:66;34589:74;34586:1;34583:81;34580:107;;;34667:18;;:::i;:::-;34580:107;34711:1;34708;34704:9;34697:16;;34414:305;;;;:::o;34725:185::-;34765:1;34782:20;34800:1;34782:20;:::i;:::-;34777:25;;34816:20;34834:1;34816:20;:::i;:::-;34811:25;;34855:1;34845:35;;34860:18;;:::i;:::-;34845:35;34902:1;34899;34895:9;34890:14;;34725:185;;;;:::o;34916:191::-;34956:4;34976:20;34994:1;34976:20;:::i;:::-;34971:25;;35010:20;35028:1;35010:20;:::i;:::-;35005:25;;35049:1;35046;35043:8;35040:34;;;35054:18;;:::i;:::-;35040:34;35099:1;35096;35092:9;35084:17;;34916:191;;;;:::o;35113:96::-;35150:7;35179:24;35197:5;35179:24;:::i;:::-;35168:35;;35113:96;;;:::o;35215:90::-;35249:7;35292:5;35285:13;35278:21;35267:32;;35215:90;;;:::o;35311:149::-;35347:7;35387:66;35380:5;35376:78;35365:89;;35311:149;;;:::o;35466:126::-;35503:7;35543:42;35536:5;35532:54;35521:65;;35466:126;;;:::o;35598:77::-;35635:7;35664:5;35653:16;;35598:77;;;:::o;35681:154::-;35765:6;35760:3;35755;35742:30;35827:1;35818:6;35813:3;35809:16;35802:27;35681:154;;;:::o;35841:307::-;35909:1;35919:113;35933:6;35930:1;35927:13;35919:113;;;36018:1;36013:3;36009:11;36003:18;35999:1;35994:3;35990:11;35983:39;35955:2;35952:1;35948:10;35943:15;;35919:113;;;36050:6;36047:1;36044:13;36041:101;;;36130:1;36121:6;36116:3;36112:16;36105:27;36041:101;35890:258;35841:307;;;:::o;36154:320::-;36198:6;36235:1;36229:4;36225:12;36215:22;;36282:1;36276:4;36272:12;36303:18;36293:81;;36359:4;36351:6;36347:17;36337:27;;36293:81;36421:2;36413:6;36410:14;36390:18;36387:38;36384:84;;;36440:18;;:::i;:::-;36384:84;36205:269;36154:320;;;:::o;36480:281::-;36563:27;36585:4;36563:27;:::i;:::-;36555:6;36551:40;36693:6;36681:10;36678:22;36657:18;36645:10;36642:34;36639:62;36636:88;;;36704:18;;:::i;:::-;36636:88;36744:10;36740:2;36733:22;36523:238;36480:281;;:::o;36767:233::-;36806:3;36829:24;36847:5;36829:24;:::i;:::-;36820:33;;36875:66;36868:5;36865:77;36862:103;;;36945:18;;:::i;:::-;36862:103;36992:1;36985:5;36981:13;36974:20;;36767:233;;;:::o;37006:176::-;37038:1;37055:20;37073:1;37055:20;:::i;:::-;37050:25;;37089:20;37107:1;37089:20;:::i;:::-;37084:25;;37128:1;37118:35;;37133:18;;:::i;:::-;37118:35;37174:1;37171;37167:9;37162:14;;37006:176;;;;:::o;37188:180::-;37236:77;37233:1;37226:88;37333:4;37330:1;37323:15;37357:4;37354:1;37347:15;37374:180;37422:77;37419:1;37412:88;37519:4;37516:1;37509:15;37543:4;37540:1;37533:15;37560:180;37608:77;37605:1;37598:88;37705:4;37702:1;37695:15;37729:4;37726:1;37719:15;37746:180;37794:77;37791:1;37784:88;37891:4;37888:1;37881:15;37915:4;37912:1;37905:15;37932:180;37980:77;37977:1;37970:88;38077:4;38074:1;38067:15;38101:4;38098:1;38091:15;38118:180;38166:77;38163:1;38156:88;38263:4;38260:1;38253:15;38287:4;38284:1;38277:15;38304:117;38413:1;38410;38403:12;38427:117;38536:1;38533;38526:12;38550:117;38659:1;38656;38649:12;38673:117;38782:1;38779;38772:12;38796:117;38905:1;38902;38895:12;38919:102;38960:6;39011:2;39007:7;39002:2;38995:5;38991:14;38987:28;38977:38;;38919:102;;;:::o;39027:230::-;39167:34;39163:1;39155:6;39151:14;39144:58;39236:13;39231:2;39223:6;39219:15;39212:38;39027:230;:::o;39263:237::-;39403:34;39399:1;39391:6;39387:14;39380:58;39472:20;39467:2;39459:6;39455:15;39448:45;39263:237;:::o;39506:225::-;39646:34;39642:1;39634:6;39630:14;39623:58;39715:8;39710:2;39702:6;39698:15;39691:33;39506:225;:::o;39737:178::-;39877:30;39873:1;39865:6;39861:14;39854:54;39737:178;:::o;39921:223::-;40061:34;40057:1;40049:6;40045:14;40038:58;40130:6;40125:2;40117:6;40113:15;40106:31;39921:223;:::o;40150:175::-;40290:27;40286:1;40278:6;40274:14;40267:51;40150:175;:::o;40331:231::-;40471:34;40467:1;40459:6;40455:14;40448:58;40540:14;40535:2;40527:6;40523:15;40516:39;40331:231;:::o;40568:243::-;40708:34;40704:1;40696:6;40692:14;40685:58;40777:26;40772:2;40764:6;40760:15;40753:51;40568:243;:::o;40817:229::-;40957:34;40953:1;40945:6;40941:14;40934:58;41026:12;41021:2;41013:6;41009:15;41002:37;40817:229;:::o;41052:228::-;41192:34;41188:1;41180:6;41176:14;41169:58;41261:11;41256:2;41248:6;41244:15;41237:36;41052:228;:::o;41286:230::-;41426:34;41422:1;41414:6;41410:14;41403:58;41495:13;41490:2;41482:6;41478:15;41471:38;41286:230;:::o;41522:221::-;41662:34;41658:1;41650:6;41646:14;41639:58;41731:4;41726:2;41718:6;41714:15;41707:29;41522:221;:::o;41749:182::-;41889:34;41885:1;41877:6;41873:14;41866:58;41749:182;:::o;41937:231::-;42077:34;42073:1;42065:6;42061:14;42054:58;42146:14;42141:2;42133:6;42129:15;42122:39;41937:231;:::o;42174:182::-;42314:34;42310:1;42302:6;42298:14;42291:58;42174:182;:::o;42362:224::-;42502:34;42498:1;42490:6;42486:14;42479:58;42571:7;42566:2;42558:6;42554:15;42547:32;42362:224;:::o;42592:228::-;42732:34;42728:1;42720:6;42716:14;42709:58;42801:11;42796:2;42788:6;42784:15;42777:36;42592:228;:::o;42826:234::-;42966:34;42962:1;42954:6;42950:14;42943:58;43035:17;43030:2;43022:6;43018:15;43011:42;42826:234;:::o;43066:220::-;43206:34;43202:1;43194:6;43190:14;43183:58;43275:3;43270:2;43262:6;43258:15;43251:28;43066:220;:::o;43292:236::-;43432:34;43428:1;43420:6;43416:14;43409:58;43501:19;43496:2;43488:6;43484:15;43477:44;43292:236;:::o;43534:231::-;43674:34;43670:1;43662:6;43658:14;43651:58;43743:14;43738:2;43730:6;43726:15;43719:39;43534:231;:::o;43771:172::-;43911:24;43907:1;43899:6;43895:14;43888:48;43771:172;:::o;43949:235::-;44089:34;44085:1;44077:6;44073:14;44066:58;44158:18;44153:2;44145:6;44141:15;44134:43;43949:235;:::o;44190:122::-;44263:24;44281:5;44263:24;:::i;:::-;44256:5;44253:35;44243:63;;44302:1;44299;44292:12;44243:63;44190:122;:::o;44318:116::-;44388:21;44403:5;44388:21;:::i;:::-;44381:5;44378:32;44368:60;;44424:1;44421;44414:12;44368:60;44318:116;:::o;44440:120::-;44512:23;44529:5;44512:23;:::i;:::-;44505:5;44502:34;44492:62;;44550:1;44547;44540:12;44492:62;44440:120;:::o;44566:122::-;44639:24;44657:5;44639:24;:::i;:::-;44632:5;44629:35;44619:63;;44678:1;44675;44668:12;44619:63;44566:122;:::o
Swarm Source
ipfs://c08cf39dfb374509ad20ccd0afd26a8c0406d2ab9a9bf0050ad130ce472097fa
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.