Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
NFT
Overview
Max Total Supply
10,000 Lizard
Holders
2,019
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 LizardLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Lizard
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-07-27 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "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] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly 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"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); } pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; } pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping (uint256 => address) private _owners; // Mapping owner address to token count mapping (address => uint256) private _balances; // Mapping from token ID to approved address mapping (uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) private _operatorApprovals; /** * @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}. 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, true); _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, true); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } function _burnSave(address owner, uint256 tokenId) internal virtual { _beforeTokenTransfer(owner, address(0), tokenId, false); // 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, true); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { // solhint-disable-next-line no-inline-assembly 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` 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, bool isDelete) internal virtual { } } pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId, bool isDelete) internal virtual override { super._beforeTokenTransfer(from, to, tokenId, isDelete); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0) && isDelete) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from && isDelete) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } pragma solidity ^0.8.0; contract Lizard is ERC721Enumerable, Ownable{ using SafeMath for uint256; using Address for address; using Strings for uint256; address public dragonContract; uint256 public constant NFT_PRICE = 30000000000000000; // 0.03 ETH uint public constant MAX_NFT_PURCHASE = 20; uint256 public MAX_SUPPLY = 10000; bool public saleIsActive = false; uint256 public startingIndex; uint256 public startingIndexBlock; string private _baseURIExtended; mapping (uint256 => string) _tokenURIs; constructor() ERC721("Crazy Lizard Army","Lizard"){ } function setDragonContractAddress(address contractAddress) public onlyOwner { dragonContract = contractAddress; } function flipSaleState() public onlyOwner { saleIsActive = !saleIsActive; } function withdraw() public onlyOwner { uint balance = address(this).balance; payable(msg.sender).transfer(balance); } function reserveTokens(uint256 num) public onlyOwner { uint supply = totalSupply(); uint i; for (i = 0; i < num; i++) { _safeMint(msg.sender, supply + i); } if (startingIndexBlock == 0) { startingIndexBlock = block.number; } } function mint(uint numberOfTokens) public payable { require(saleIsActive, "Sale is not active at the moment"); require(numberOfTokens > 0, "Number of tokens can not be less than or equal to 0"); require(totalSupply().add(numberOfTokens) <= MAX_SUPPLY, "Purchase would exceed max supply"); require(numberOfTokens <= MAX_NFT_PURCHASE,"Can only mint up to 10 per purchase"); require(NFT_PRICE.mul(numberOfTokens) == msg.value, "Sent ether value is incorrect"); for (uint i = 0; i < numberOfTokens; i++) { _safeMint(msg.sender, totalSupply()); } } function bet(uint256 useTokenId1) public { require(dragonContract != address(0), "Dragon contract address need be set"); address from = msg.sender; require(ERC721.ownerOf(useTokenId1) == from, "ERC721: use of token1 that is not own"); _burnSave(from, useTokenId1); Dragon dragon = Dragon(dragonContract); bool result = dragon.betDragon(from); require(result, "Dragon compose failed"); } function compose(uint256 useTokenId1, uint256 useTokenId2, uint256 useTokenId3) public { require(dragonContract != address(0), "Dragon contract address need be set"); address from = msg.sender; require(ERC721.ownerOf(useTokenId1) == from, "ERC721: use of token1 that is not own"); require(ERC721.ownerOf(useTokenId2) == from, "ERC721: use of token2 that is not own"); require(ERC721.ownerOf(useTokenId3) == from, "ERC721: use of token3 that is not own"); _burnSave(from, useTokenId1); _burnSave(from, useTokenId2); _burnSave(from, useTokenId3); Dragon dragon = Dragon(dragonContract); bool result = dragon.composeDragon(from); require(result, "Dragon compose failed"); } function calcStartingIndex() public onlyOwner { require(startingIndex == 0, "Starting index has already been set"); require(startingIndexBlock != 0, "Starting index has not been set yet"); startingIndex = uint(blockhash(startingIndexBlock)) % MAX_SUPPLY; // Just a sanity case in the worst case if this function is called late (EVM only stores last 256 block hashes) if(block.number.sub(startingIndexBlock) > 255) { startingIndex = uint(blockhash(block.number - 1)) % MAX_SUPPLY; } // To prevent original sequence if (startingIndex == 0) { startingIndex = startingIndex.add(1); } } function emergencySetStartingIndexBlock() public onlyOwner { require(startingIndex == 0, "Starting index is already set"); startingIndexBlock = block.number; } function _baseURI() internal view virtual override returns (string memory) { return _baseURIExtended; } // Sets base URI for all tokens, only able to be called by contract owner function setBaseURI(string memory baseURI_) external onlyOwner { _baseURIExtended = baseURI_; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI. return string(abi.encodePacked(base, tokenId.toString())); } } interface Dragon { function composeDragon(address owner) external returns (bool); function betDragon(address owner) external returns (bool); }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_NFT_PURCHASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"useTokenId1","type":"uint256"}],"name":"bet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"calcStartingIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"useTokenId1","type":"uint256"},{"internalType":"uint256","name":"useTokenId2","type":"uint256"},{"internalType":"uint256","name":"useTokenId3","type":"uint256"}],"name":"compose","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dragonContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencySetStartingIndexBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"reserveTokens","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":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setDragonContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startingIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startingIndexBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052612710600c556000600d60006101000a81548160ff0219169083151502179055503480156200003257600080fd5b506040518060400160405280601181526020017f4372617a79204c697a6172642041726d790000000000000000000000000000008152506040518060400160405280600681526020017f4c697a61726400000000000000000000000000000000000000000000000000008152508160009080519060200190620000b792919062000192565b508060019080519060200190620000d092919062000192565b5050506000620000e56200018a60201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620002a7565b600033905090565b828054620001a09062000242565b90600052602060002090601f016020900481019282620001c4576000855562000210565b82601f10620001df57805160ff191683800117855562000210565b8280016001018555821562000210579182015b828111156200020f578251825591602001919060010190620001f2565b5b5090506200021f919062000223565b5090565b5b808211156200023e57600081600090555060010162000224565b5090565b600060028204905060018216806200025b57607f821691505b6020821081141562000272576200027162000278565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614f0a80620002b76000396000f3fe60806040526004361061020f5760003560e01c8063715018a611610118578063b88d4fde116100a0578063e13f351a1161006f578063e13f351a14610754578063e36d64981461076b578063e985e9c514610796578063eb8d2444146107d3578063f2fde38b146107fe5761020f565b8063b88d4fde1461069a578063c87b56dd146106c3578063cb774d4714610700578063d031370b1461072b5761020f565b80638da5cb5b116100e75780638da5cb5b146105d457806395d89b41146105ff5780639711dc381461062a578063a0712d6814610655578063a22cb465146106715761020f565b8063715018a6146105545780637365870b1461056b5780637d17fcbe14610594578063888a14ec146105ab5761020f565b806334918dfd1161019b57806355f804b31161016a57806355f804b31461045d5780636352211e14610486578063658a3b3c146104c3578063676dd563146104ec57806370a08231146105175761020f565b806334918dfd146103c95780633ccfd60b146103e057806342842e0e146103f75780634f6ccce7146104205761020f565b8063095ea7b3116101e2578063095ea7b3146102e457806318160ddd1461030d57806323b872dd146103385780632f745c591461036157806332cb6b0c1461039e5761020f565b806301ffc9a714610214578063020b39cc1461025157806306fdde031461027c578063081812fc146102a7575b600080fd5b34801561022057600080fd5b5061023b600480360381019061023691906138be565b610827565b6040516102489190614628565b60405180910390f35b34801561025d57600080fd5b506102666108a1565b6040516102739190614a45565b60405180910390f35b34801561028857600080fd5b506102916108a6565b60405161029e9190614643565b60405180910390f35b3480156102b357600080fd5b506102ce60048036038101906102c99190613951565b610938565b6040516102db91906145c1565b60405180910390f35b3480156102f057600080fd5b5061030b60048036038101906103069190613859565b6109bd565b005b34801561031957600080fd5b50610322610ad5565b60405161032f9190614a45565b60405180910390f35b34801561034457600080fd5b5061035f600480360381019061035a9190613753565b610ae2565b005b34801561036d57600080fd5b5061038860048036038101906103839190613859565b610b42565b6040516103959190614a45565b60405180910390f35b3480156103aa57600080fd5b506103b3610be7565b6040516103c09190614a45565b60405180910390f35b3480156103d557600080fd5b506103de610bed565b005b3480156103ec57600080fd5b506103f5610c95565b005b34801561040357600080fd5b5061041e60048036038101906104199190613753565b610d60565b005b34801561042c57600080fd5b5061044760048036038101906104429190613951565b610d80565b6040516104549190614a45565b60405180910390f35b34801561046957600080fd5b50610484600480360381019061047f9190613910565b610e17565b005b34801561049257600080fd5b506104ad60048036038101906104a89190613951565b610ead565b6040516104ba91906145c1565b60405180910390f35b3480156104cf57600080fd5b506104ea60048036038101906104e591906136ee565b610f5f565b005b3480156104f857600080fd5b5061050161101f565b60405161050e9190614a45565b60405180910390f35b34801561052357600080fd5b5061053e600480360381019061053991906136ee565b61102a565b60405161054b9190614a45565b60405180910390f35b34801561056057600080fd5b506105696110e2565b005b34801561057757600080fd5b50610592600480360381019061058d9190613951565b61121f565b005b3480156105a057600080fd5b506105a9611432565b005b3480156105b757600080fd5b506105d260048036038101906105cd919061397a565b6114fc565b005b3480156105e057600080fd5b506105e9611811565b6040516105f691906145c1565b60405180910390f35b34801561060b57600080fd5b5061061461183b565b6040516106219190614643565b60405180910390f35b34801561063657600080fd5b5061063f6118cd565b60405161064c91906145c1565b60405180910390f35b61066f600480360381019061066a9190613951565b6118f3565b005b34801561067d57600080fd5b506106986004803603810190610693919061381d565b611ab5565b005b3480156106a657600080fd5b506106c160048036038101906106bc91906137a2565b611c36565b005b3480156106cf57600080fd5b506106ea60048036038101906106e59190613951565b611c98565b6040516106f79190614643565b60405180910390f35b34801561070c57600080fd5b50610715611e0b565b6040516107229190614a45565b60405180910390f35b34801561073757600080fd5b50610752600480360381019061074d9190613951565b611e11565b005b34801561076057600080fd5b50610769611ee4565b005b34801561077757600080fd5b50610780612071565b60405161078d9190614a45565b60405180910390f35b3480156107a257600080fd5b506107bd60048036038101906107b89190613717565b612077565b6040516107ca9190614628565b60405180910390f35b3480156107df57600080fd5b506107e861210b565b6040516107f59190614628565b60405180910390f35b34801561080a57600080fd5b50610825600480360381019061082091906136ee565b61211e565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061089a5750610899826122ca565b5b9050919050565b601481565b6060600080546108b590614cff565b80601f01602080910402602001604051908101604052809291908181526020018280546108e190614cff565b801561092e5780601f106109035761010080835404028352916020019161092e565b820191906000526020600020905b81548152906001019060200180831161091157829003601f168201915b5050505050905090565b6000610943826123ac565b610982576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610979906148e5565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109c882610ead565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3090614965565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a58612418565b73ffffffffffffffffffffffffffffffffffffffff161480610a875750610a8681610a81612418565b612077565b5b610ac6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abd90614805565b60405180910390fd5b610ad08383612420565b505050565b6000600880549050905090565b610af3610aed612418565b826124d9565b610b32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2990614985565b60405180910390fd5b610b3d8383836125b7565b505050565b6000610b4d8361102a565b8210610b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b85906146e5565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600c5481565b610bf5612418565b73ffffffffffffffffffffffffffffffffffffffff16610c13611811565b73ffffffffffffffffffffffffffffffffffffffff1614610c69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6090614905565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b610c9d612418565b73ffffffffffffffffffffffffffffffffffffffff16610cbb611811565b73ffffffffffffffffffffffffffffffffffffffff1614610d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0890614905565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610d5c573d6000803e3d6000fd5b5050565b610d7b83838360405180602001604052806000815250611c36565b505050565b6000610d8a610ad5565b8210610dcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc2906149a5565b60405180910390fd5b60088281548110610e05577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610e1f612418565b73ffffffffffffffffffffffffffffffffffffffff16610e3d611811565b73ffffffffffffffffffffffffffffffffffffffff1614610e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8a90614905565b60405180910390fd5b8060109080519060200190610ea99291906134fd565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4d90614845565b60405180910390fd5b80915050919050565b610f67612418565b73ffffffffffffffffffffffffffffffffffffffff16610f85611811565b73ffffffffffffffffffffffffffffffffffffffff1614610fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd290614905565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b666a94d74f43000081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561109b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109290614825565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110ea612418565b73ffffffffffffffffffffffffffffffffffffffff16611108611811565b73ffffffffffffffffffffffffffffffffffffffff161461115e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115590614905565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156112b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a890614865565b60405180910390fd5b60003390508073ffffffffffffffffffffffffffffffffffffffff166112d683610ead565b73ffffffffffffffffffffffffffffffffffffffff161461132c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611323906149e5565b60405180910390fd5b6113368183612815565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff1663725625a0846040518263ffffffff1660e01b815260040161139891906145c1565b602060405180830381600087803b1580156113b257600080fd5b505af11580156113c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ea9190613895565b90508061142c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611423906146a5565b60405180910390fd5b50505050565b61143a612418565b73ffffffffffffffffffffffffffffffffffffffff16611458611811565b73ffffffffffffffffffffffffffffffffffffffff16146114ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a590614905565b60405180910390fd5b6000600e54146114f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ea906147e5565b60405180910390fd5b43600f81905550565b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561158e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158590614865565b60405180910390fd5b60003390508073ffffffffffffffffffffffffffffffffffffffff166115b385610ead565b73ffffffffffffffffffffffffffffffffffffffff1614611609576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611600906149e5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661162984610ead565b73ffffffffffffffffffffffffffffffffffffffff161461167f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167690614a05565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661169f83610ead565b73ffffffffffffffffffffffffffffffffffffffff16146116f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ec906146c5565b60405180910390fd5b6116ff8185612815565b6117098184612815565b6117138183612815565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff1663a96f7ef1846040518263ffffffff1660e01b815260040161177591906145c1565b602060405180830381600087803b15801561178f57600080fd5b505af11580156117a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c79190613895565b905080611809576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611800906146a5565b60405180910390fd5b505050505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461184a90614cff565b80601f016020809104026020016040519081016040528092919081815260200182805461187690614cff565b80156118c35780601f10611898576101008083540402835291602001916118c3565b820191906000526020600020905b8154815290600101906020018083116118a657829003601f168201915b5050505050905090565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60009054906101000a900460ff16611942576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193990614a25565b60405180910390fd5b60008111611985576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197c90614685565b60405180910390fd5b600c546119a282611994610ad5565b61291b90919063ffffffff16565b11156119e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119da906148a5565b60405180910390fd5b6014811115611a27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1e90614765565b60405180910390fd5b34611a4282666a94d74f43000061293190919063ffffffff16565b14611a82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7990614885565b60405180910390fd5b60005b81811015611ab157611a9e33611a99610ad5565b612947565b8080611aa990614d31565b915050611a85565b5050565b611abd612418565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b22906147a5565b60405180910390fd5b8060056000611b38612418565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611be5612418565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c2a9190614628565b60405180910390a35050565b611c47611c41612418565b836124d9565b611c86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7d90614985565b60405180910390fd5b611c9284848484612965565b50505050565b6060611ca3826123ac565b611ce2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd990614945565b60405180910390fd5b6000601160008481526020019081526020016000208054611d0290614cff565b80601f0160208091040260200160405190810160405280929190818152602001828054611d2e90614cff565b8015611d7b5780601f10611d5057610100808354040283529160200191611d7b565b820191906000526020600020905b815481529060010190602001808311611d5e57829003601f168201915b505050505090506000611d8c6129c1565b9050600081511415611da2578192505050611e06565b600082511115611dd7578082604051602001611dbf92919061459d565b60405160208183030381529060405292505050611e06565b80611de185612a53565b604051602001611df292919061459d565b604051602081830303815290604052925050505b919050565b600e5481565b611e19612418565b73ffffffffffffffffffffffffffffffffffffffff16611e37611811565b73ffffffffffffffffffffffffffffffffffffffff1614611e8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8490614905565b60405180910390fd5b6000611e97610ad5565b905060005b82811015611ecc57611eb9338284611eb49190614b34565b612947565b8080611ec490614d31565b915050611e9c565b6000600f541415611edf5743600f819055505b505050565b611eec612418565b73ffffffffffffffffffffffffffffffffffffffff16611f0a611811565b73ffffffffffffffffffffffffffffffffffffffff1614611f60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5790614905565b60405180910390fd5b6000600e5414611fa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9c906149c5565b60405180910390fd5b6000600f541415611feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe290614665565b60405180910390fd5b600c54600f544060001c611fff9190614d7a565b600e8190555060ff61201c600f5443612c0090919063ffffffff16565b111561204757600c546001436120329190614c15565b4060001c6120409190614d7a565b600e819055505b6000600e54141561206f576120686001600e5461291b90919063ffffffff16565b600e819055505b565b600f5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60009054906101000a900460ff1681565b612126612418565b73ffffffffffffffffffffffffffffffffffffffff16612144611811565b73ffffffffffffffffffffffffffffffffffffffff161461219a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219190614905565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561220a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220190614725565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061239557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806123a557506123a482612c16565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661249383610ead565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006124e4826123ac565b612523576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251a906147c5565b60405180910390fd5b600061252e83610ead565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061259d57508373ffffffffffffffffffffffffffffffffffffffff1661258584610938565b73ffffffffffffffffffffffffffffffffffffffff16145b806125ae57506125ad8185612077565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166125d782610ead565b73ffffffffffffffffffffffffffffffffffffffff161461262d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262490614925565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561269d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269490614785565b60405180910390fd5b6126aa8383836001612c80565b6126b5600082612420565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127059190614c15565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461275c9190614b34565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612823826000836000612c80565b61282e600082612420565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461287e9190614c15565b925050819055506002600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905580600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600081836129299190614b34565b905092915050565b6000818361293f9190614bbb565b905092915050565b612961828260405180602001604052806000815250612daa565b5050565b6129708484846125b7565b61297c84848484612e05565b6129bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b290614705565b60405180910390fd5b50505050565b6060601080546129d090614cff565b80601f01602080910402602001604051908101604052809291908181526020018280546129fc90614cff565b8015612a495780601f10612a1e57610100808354040283529160200191612a49565b820191906000526020600020905b815481529060010190602001808311612a2c57829003601f168201915b5050505050905090565b60606000821415612a9b576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612bfb565b600082905060005b60008214612acd578080612ab690614d31565b915050600a82612ac69190614b8a565b9150612aa3565b60008167ffffffffffffffff811115612b0f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612b415781602001600182028036833780820191505090505b5090505b60008514612bf457600182612b5a9190614c15565b9150600a85612b699190614d7a565b6030612b759190614b34565b60f81b818381518110612bb1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612bed9190614b8a565b9450612b45565b8093505050505b919050565b60008183612c0e9190614c15565b905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612c8c84848484612f9c565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612ccf57612cca82612fa2565b612d0e565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612d0d57612d0c8483612feb565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148015612d475750805b15612d5a57612d5582613158565b612da4565b8373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612d935750805b15612da357612da2838361329b565b5b5b50505050565b612db4838361331a565b612dc16000848484612e05565b612e00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df790614705565b60405180910390fd5b505050565b6000612e268473ffffffffffffffffffffffffffffffffffffffff166134ea565b15612f8f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e4f612418565b8786866040518563ffffffff1660e01b8152600401612e7194939291906145dc565b602060405180830381600087803b158015612e8b57600080fd5b505af1925050508015612ebc57506040513d601f19601f82011682018060405250810190612eb991906138e7565b60015b612f3f573d8060008114612eec576040519150601f19603f3d011682016040523d82523d6000602084013e612ef1565b606091505b50600081511415612f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2e90614705565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f94565b600190505b949350505050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612ff88461102a565b6130029190614c15565b90506000600760008481526020019081526020016000205490508181146130e7576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061316c9190614c15565b90506000600960008481526020019081526020016000205490506000600883815481106131c2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811061320a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061327f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006132a68361102a565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561338a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613381906148c5565b60405180910390fd5b613393816123ac565b156133d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ca90614745565b60405180910390fd5b6133e1600083836001612c80565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134319190614b34565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461350990614cff565b90600052602060002090601f01602090048101928261352b5760008555613572565b82601f1061354457805160ff1916838001178555613572565b82800160010185558215613572579182015b82811115613571578251825591602001919060010190613556565b5b50905061357f9190613583565b5090565b5b8082111561359c576000816000905550600101613584565b5090565b60006135b36135ae84614a91565b614a60565b9050828152602081018484840111156135cb57600080fd5b6135d6848285614cbd565b509392505050565b60006135f16135ec84614ac1565b614a60565b90508281526020810184848401111561360957600080fd5b613614848285614cbd565b509392505050565b60008135905061362b81614e78565b92915050565b60008135905061364081614e8f565b92915050565b60008151905061365581614e8f565b92915050565b60008135905061366a81614ea6565b92915050565b60008151905061367f81614ea6565b92915050565b600082601f83011261369657600080fd5b81356136a68482602086016135a0565b91505092915050565b600082601f8301126136c057600080fd5b81356136d08482602086016135de565b91505092915050565b6000813590506136e881614ebd565b92915050565b60006020828403121561370057600080fd5b600061370e8482850161361c565b91505092915050565b6000806040838503121561372a57600080fd5b60006137388582860161361c565b92505060206137498582860161361c565b9150509250929050565b60008060006060848603121561376857600080fd5b60006137768682870161361c565b93505060206137878682870161361c565b9250506040613798868287016136d9565b9150509250925092565b600080600080608085870312156137b857600080fd5b60006137c68782880161361c565b94505060206137d78782880161361c565b93505060406137e8878288016136d9565b925050606085013567ffffffffffffffff81111561380557600080fd5b61381187828801613685565b91505092959194509250565b6000806040838503121561383057600080fd5b600061383e8582860161361c565b925050602061384f85828601613631565b9150509250929050565b6000806040838503121561386c57600080fd5b600061387a8582860161361c565b925050602061388b858286016136d9565b9150509250929050565b6000602082840312156138a757600080fd5b60006138b584828501613646565b91505092915050565b6000602082840312156138d057600080fd5b60006138de8482850161365b565b91505092915050565b6000602082840312156138f957600080fd5b600061390784828501613670565b91505092915050565b60006020828403121561392257600080fd5b600082013567ffffffffffffffff81111561393c57600080fd5b613948848285016136af565b91505092915050565b60006020828403121561396357600080fd5b6000613971848285016136d9565b91505092915050565b60008060006060848603121561398f57600080fd5b600061399d868287016136d9565b93505060206139ae868287016136d9565b92505060406139bf868287016136d9565b9150509250925092565b6139d281614c49565b82525050565b6139e181614c5b565b82525050565b60006139f282614af1565b6139fc8185614b07565b9350613a0c818560208601614ccc565b613a1581614e67565b840191505092915050565b6000613a2b82614afc565b613a358185614b18565b9350613a45818560208601614ccc565b613a4e81614e67565b840191505092915050565b6000613a6482614afc565b613a6e8185614b29565b9350613a7e818560208601614ccc565b80840191505092915050565b6000613a97602383614b18565b91507f5374617274696e6720696e64657820686173206e6f74206265656e207365742060008301527f79657400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613afd603383614b18565b91507f4e756d626572206f6620746f6b656e732063616e206e6f74206265206c65737360008301527f207468616e206f7220657175616c20746f2030000000000000000000000000006020830152604082019050919050565b6000613b63601583614b18565b91507f447261676f6e20636f6d706f7365206661696c656400000000000000000000006000830152602082019050919050565b6000613ba3602583614b18565b91507f4552433732313a20757365206f6620746f6b656e332074686174206973206e6f60008301527f74206f776e0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c09602b83614b18565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613c6f603283614b18565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613cd5602683614b18565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d3b601c83614b18565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613d7b602383614b18565b91507f43616e206f6e6c79206d696e7420757020746f2031302070657220707572636860008301527f61736500000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613de1602483614b18565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e47601983614b18565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613e87602c83614b18565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613eed601d83614b18565b91507f5374617274696e6720696e64657820697320616c7265616479207365740000006000830152602082019050919050565b6000613f2d603883614b18565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613f93602a83614b18565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ff9602983614b18565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061405f602383614b18565b91507f447261676f6e20636f6e74726163742061646472657373206e6565642062652060008301527f73657400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006140c5601d83614b18565b91507f53656e742065746865722076616c756520697320696e636f72726563740000006000830152602082019050919050565b6000614105602083614b18565b91507f507572636861736520776f756c6420657863656564206d617820737570706c796000830152602082019050919050565b6000614145602083614b18565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614185602c83614b18565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006141eb602083614b18565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061422b602983614b18565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614291602f83614b18565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006142f7602183614b18565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061435d603183614b18565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006143c3602c83614b18565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000614429602383614b18565b91507f5374617274696e6720696e6465782068617320616c7265616479206265656e2060008301527f73657400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061448f602583614b18565b91507f4552433732313a20757365206f6620746f6b656e312074686174206973206e6f60008301527f74206f776e0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006144f5602583614b18565b91507f4552433732313a20757365206f6620746f6b656e322074686174206973206e6f60008301527f74206f776e0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061455b602083614b18565b91507f53616c65206973206e6f742061637469766520617420746865206d6f6d656e746000830152602082019050919050565b61459781614cb3565b82525050565b60006145a98285613a59565b91506145b58284613a59565b91508190509392505050565b60006020820190506145d660008301846139c9565b92915050565b60006080820190506145f160008301876139c9565b6145fe60208301866139c9565b61460b604083018561458e565b818103606083015261461d81846139e7565b905095945050505050565b600060208201905061463d60008301846139d8565b92915050565b6000602082019050818103600083015261465d8184613a20565b905092915050565b6000602082019050818103600083015261467e81613a8a565b9050919050565b6000602082019050818103600083015261469e81613af0565b9050919050565b600060208201905081810360008301526146be81613b56565b9050919050565b600060208201905081810360008301526146de81613b96565b9050919050565b600060208201905081810360008301526146fe81613bfc565b9050919050565b6000602082019050818103600083015261471e81613c62565b9050919050565b6000602082019050818103600083015261473e81613cc8565b9050919050565b6000602082019050818103600083015261475e81613d2e565b9050919050565b6000602082019050818103600083015261477e81613d6e565b9050919050565b6000602082019050818103600083015261479e81613dd4565b9050919050565b600060208201905081810360008301526147be81613e3a565b9050919050565b600060208201905081810360008301526147de81613e7a565b9050919050565b600060208201905081810360008301526147fe81613ee0565b9050919050565b6000602082019050818103600083015261481e81613f20565b9050919050565b6000602082019050818103600083015261483e81613f86565b9050919050565b6000602082019050818103600083015261485e81613fec565b9050919050565b6000602082019050818103600083015261487e81614052565b9050919050565b6000602082019050818103600083015261489e816140b8565b9050919050565b600060208201905081810360008301526148be816140f8565b9050919050565b600060208201905081810360008301526148de81614138565b9050919050565b600060208201905081810360008301526148fe81614178565b9050919050565b6000602082019050818103600083015261491e816141de565b9050919050565b6000602082019050818103600083015261493e8161421e565b9050919050565b6000602082019050818103600083015261495e81614284565b9050919050565b6000602082019050818103600083015261497e816142ea565b9050919050565b6000602082019050818103600083015261499e81614350565b9050919050565b600060208201905081810360008301526149be816143b6565b9050919050565b600060208201905081810360008301526149de8161441c565b9050919050565b600060208201905081810360008301526149fe81614482565b9050919050565b60006020820190508181036000830152614a1e816144e8565b9050919050565b60006020820190508181036000830152614a3e8161454e565b9050919050565b6000602082019050614a5a600083018461458e565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614a8757614a86614e38565b5b8060405250919050565b600067ffffffffffffffff821115614aac57614aab614e38565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614adc57614adb614e38565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614b3f82614cb3565b9150614b4a83614cb3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b7f57614b7e614dab565b5b828201905092915050565b6000614b9582614cb3565b9150614ba083614cb3565b925082614bb057614baf614dda565b5b828204905092915050565b6000614bc682614cb3565b9150614bd183614cb3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614c0a57614c09614dab565b5b828202905092915050565b6000614c2082614cb3565b9150614c2b83614cb3565b925082821015614c3e57614c3d614dab565b5b828203905092915050565b6000614c5482614c93565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614cea578082015181840152602081019050614ccf565b83811115614cf9576000848401525b50505050565b60006002820490506001821680614d1757607f821691505b60208210811415614d2b57614d2a614e09565b5b50919050565b6000614d3c82614cb3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614d6f57614d6e614dab565b5b600182019050919050565b6000614d8582614cb3565b9150614d9083614cb3565b925082614da057614d9f614dda565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b614e8181614c49565b8114614e8c57600080fd5b50565b614e9881614c5b565b8114614ea357600080fd5b50565b614eaf81614c67565b8114614eba57600080fd5b50565b614ec681614cb3565b8114614ed157600080fd5b5056fea264697066735822122084591db8de77eccbbf29e81f63ddf9672c8d94d4bf0611eaba7cafbe7412377464736f6c63430008000033
Deployed Bytecode
0x60806040526004361061020f5760003560e01c8063715018a611610118578063b88d4fde116100a0578063e13f351a1161006f578063e13f351a14610754578063e36d64981461076b578063e985e9c514610796578063eb8d2444146107d3578063f2fde38b146107fe5761020f565b8063b88d4fde1461069a578063c87b56dd146106c3578063cb774d4714610700578063d031370b1461072b5761020f565b80638da5cb5b116100e75780638da5cb5b146105d457806395d89b41146105ff5780639711dc381461062a578063a0712d6814610655578063a22cb465146106715761020f565b8063715018a6146105545780637365870b1461056b5780637d17fcbe14610594578063888a14ec146105ab5761020f565b806334918dfd1161019b57806355f804b31161016a57806355f804b31461045d5780636352211e14610486578063658a3b3c146104c3578063676dd563146104ec57806370a08231146105175761020f565b806334918dfd146103c95780633ccfd60b146103e057806342842e0e146103f75780634f6ccce7146104205761020f565b8063095ea7b3116101e2578063095ea7b3146102e457806318160ddd1461030d57806323b872dd146103385780632f745c591461036157806332cb6b0c1461039e5761020f565b806301ffc9a714610214578063020b39cc1461025157806306fdde031461027c578063081812fc146102a7575b600080fd5b34801561022057600080fd5b5061023b600480360381019061023691906138be565b610827565b6040516102489190614628565b60405180910390f35b34801561025d57600080fd5b506102666108a1565b6040516102739190614a45565b60405180910390f35b34801561028857600080fd5b506102916108a6565b60405161029e9190614643565b60405180910390f35b3480156102b357600080fd5b506102ce60048036038101906102c99190613951565b610938565b6040516102db91906145c1565b60405180910390f35b3480156102f057600080fd5b5061030b60048036038101906103069190613859565b6109bd565b005b34801561031957600080fd5b50610322610ad5565b60405161032f9190614a45565b60405180910390f35b34801561034457600080fd5b5061035f600480360381019061035a9190613753565b610ae2565b005b34801561036d57600080fd5b5061038860048036038101906103839190613859565b610b42565b6040516103959190614a45565b60405180910390f35b3480156103aa57600080fd5b506103b3610be7565b6040516103c09190614a45565b60405180910390f35b3480156103d557600080fd5b506103de610bed565b005b3480156103ec57600080fd5b506103f5610c95565b005b34801561040357600080fd5b5061041e60048036038101906104199190613753565b610d60565b005b34801561042c57600080fd5b5061044760048036038101906104429190613951565b610d80565b6040516104549190614a45565b60405180910390f35b34801561046957600080fd5b50610484600480360381019061047f9190613910565b610e17565b005b34801561049257600080fd5b506104ad60048036038101906104a89190613951565b610ead565b6040516104ba91906145c1565b60405180910390f35b3480156104cf57600080fd5b506104ea60048036038101906104e591906136ee565b610f5f565b005b3480156104f857600080fd5b5061050161101f565b60405161050e9190614a45565b60405180910390f35b34801561052357600080fd5b5061053e600480360381019061053991906136ee565b61102a565b60405161054b9190614a45565b60405180910390f35b34801561056057600080fd5b506105696110e2565b005b34801561057757600080fd5b50610592600480360381019061058d9190613951565b61121f565b005b3480156105a057600080fd5b506105a9611432565b005b3480156105b757600080fd5b506105d260048036038101906105cd919061397a565b6114fc565b005b3480156105e057600080fd5b506105e9611811565b6040516105f691906145c1565b60405180910390f35b34801561060b57600080fd5b5061061461183b565b6040516106219190614643565b60405180910390f35b34801561063657600080fd5b5061063f6118cd565b60405161064c91906145c1565b60405180910390f35b61066f600480360381019061066a9190613951565b6118f3565b005b34801561067d57600080fd5b506106986004803603810190610693919061381d565b611ab5565b005b3480156106a657600080fd5b506106c160048036038101906106bc91906137a2565b611c36565b005b3480156106cf57600080fd5b506106ea60048036038101906106e59190613951565b611c98565b6040516106f79190614643565b60405180910390f35b34801561070c57600080fd5b50610715611e0b565b6040516107229190614a45565b60405180910390f35b34801561073757600080fd5b50610752600480360381019061074d9190613951565b611e11565b005b34801561076057600080fd5b50610769611ee4565b005b34801561077757600080fd5b50610780612071565b60405161078d9190614a45565b60405180910390f35b3480156107a257600080fd5b506107bd60048036038101906107b89190613717565b612077565b6040516107ca9190614628565b60405180910390f35b3480156107df57600080fd5b506107e861210b565b6040516107f59190614628565b60405180910390f35b34801561080a57600080fd5b50610825600480360381019061082091906136ee565b61211e565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061089a5750610899826122ca565b5b9050919050565b601481565b6060600080546108b590614cff565b80601f01602080910402602001604051908101604052809291908181526020018280546108e190614cff565b801561092e5780601f106109035761010080835404028352916020019161092e565b820191906000526020600020905b81548152906001019060200180831161091157829003601f168201915b5050505050905090565b6000610943826123ac565b610982576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610979906148e5565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109c882610ead565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3090614965565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a58612418565b73ffffffffffffffffffffffffffffffffffffffff161480610a875750610a8681610a81612418565b612077565b5b610ac6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abd90614805565b60405180910390fd5b610ad08383612420565b505050565b6000600880549050905090565b610af3610aed612418565b826124d9565b610b32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2990614985565b60405180910390fd5b610b3d8383836125b7565b505050565b6000610b4d8361102a565b8210610b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b85906146e5565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600c5481565b610bf5612418565b73ffffffffffffffffffffffffffffffffffffffff16610c13611811565b73ffffffffffffffffffffffffffffffffffffffff1614610c69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6090614905565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b610c9d612418565b73ffffffffffffffffffffffffffffffffffffffff16610cbb611811565b73ffffffffffffffffffffffffffffffffffffffff1614610d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0890614905565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610d5c573d6000803e3d6000fd5b5050565b610d7b83838360405180602001604052806000815250611c36565b505050565b6000610d8a610ad5565b8210610dcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc2906149a5565b60405180910390fd5b60088281548110610e05577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610e1f612418565b73ffffffffffffffffffffffffffffffffffffffff16610e3d611811565b73ffffffffffffffffffffffffffffffffffffffff1614610e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8a90614905565b60405180910390fd5b8060109080519060200190610ea99291906134fd565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4d90614845565b60405180910390fd5b80915050919050565b610f67612418565b73ffffffffffffffffffffffffffffffffffffffff16610f85611811565b73ffffffffffffffffffffffffffffffffffffffff1614610fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd290614905565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b666a94d74f43000081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561109b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109290614825565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6110ea612418565b73ffffffffffffffffffffffffffffffffffffffff16611108611811565b73ffffffffffffffffffffffffffffffffffffffff161461115e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115590614905565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156112b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a890614865565b60405180910390fd5b60003390508073ffffffffffffffffffffffffffffffffffffffff166112d683610ead565b73ffffffffffffffffffffffffffffffffffffffff161461132c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611323906149e5565b60405180910390fd5b6113368183612815565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff1663725625a0846040518263ffffffff1660e01b815260040161139891906145c1565b602060405180830381600087803b1580156113b257600080fd5b505af11580156113c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ea9190613895565b90508061142c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611423906146a5565b60405180910390fd5b50505050565b61143a612418565b73ffffffffffffffffffffffffffffffffffffffff16611458611811565b73ffffffffffffffffffffffffffffffffffffffff16146114ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a590614905565b60405180910390fd5b6000600e54146114f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ea906147e5565b60405180910390fd5b43600f81905550565b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561158e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158590614865565b60405180910390fd5b60003390508073ffffffffffffffffffffffffffffffffffffffff166115b385610ead565b73ffffffffffffffffffffffffffffffffffffffff1614611609576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611600906149e5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661162984610ead565b73ffffffffffffffffffffffffffffffffffffffff161461167f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167690614a05565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661169f83610ead565b73ffffffffffffffffffffffffffffffffffffffff16146116f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ec906146c5565b60405180910390fd5b6116ff8185612815565b6117098184612815565b6117138183612815565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff1663a96f7ef1846040518263ffffffff1660e01b815260040161177591906145c1565b602060405180830381600087803b15801561178f57600080fd5b505af11580156117a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c79190613895565b905080611809576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611800906146a5565b60405180910390fd5b505050505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461184a90614cff565b80601f016020809104026020016040519081016040528092919081815260200182805461187690614cff565b80156118c35780601f10611898576101008083540402835291602001916118c3565b820191906000526020600020905b8154815290600101906020018083116118a657829003601f168201915b5050505050905090565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60009054906101000a900460ff16611942576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193990614a25565b60405180910390fd5b60008111611985576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197c90614685565b60405180910390fd5b600c546119a282611994610ad5565b61291b90919063ffffffff16565b11156119e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119da906148a5565b60405180910390fd5b6014811115611a27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1e90614765565b60405180910390fd5b34611a4282666a94d74f43000061293190919063ffffffff16565b14611a82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7990614885565b60405180910390fd5b60005b81811015611ab157611a9e33611a99610ad5565b612947565b8080611aa990614d31565b915050611a85565b5050565b611abd612418565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b22906147a5565b60405180910390fd5b8060056000611b38612418565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611be5612418565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c2a9190614628565b60405180910390a35050565b611c47611c41612418565b836124d9565b611c86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7d90614985565b60405180910390fd5b611c9284848484612965565b50505050565b6060611ca3826123ac565b611ce2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd990614945565b60405180910390fd5b6000601160008481526020019081526020016000208054611d0290614cff565b80601f0160208091040260200160405190810160405280929190818152602001828054611d2e90614cff565b8015611d7b5780601f10611d5057610100808354040283529160200191611d7b565b820191906000526020600020905b815481529060010190602001808311611d5e57829003601f168201915b505050505090506000611d8c6129c1565b9050600081511415611da2578192505050611e06565b600082511115611dd7578082604051602001611dbf92919061459d565b60405160208183030381529060405292505050611e06565b80611de185612a53565b604051602001611df292919061459d565b604051602081830303815290604052925050505b919050565b600e5481565b611e19612418565b73ffffffffffffffffffffffffffffffffffffffff16611e37611811565b73ffffffffffffffffffffffffffffffffffffffff1614611e8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8490614905565b60405180910390fd5b6000611e97610ad5565b905060005b82811015611ecc57611eb9338284611eb49190614b34565b612947565b8080611ec490614d31565b915050611e9c565b6000600f541415611edf5743600f819055505b505050565b611eec612418565b73ffffffffffffffffffffffffffffffffffffffff16611f0a611811565b73ffffffffffffffffffffffffffffffffffffffff1614611f60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5790614905565b60405180910390fd5b6000600e5414611fa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9c906149c5565b60405180910390fd5b6000600f541415611feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe290614665565b60405180910390fd5b600c54600f544060001c611fff9190614d7a565b600e8190555060ff61201c600f5443612c0090919063ffffffff16565b111561204757600c546001436120329190614c15565b4060001c6120409190614d7a565b600e819055505b6000600e54141561206f576120686001600e5461291b90919063ffffffff16565b600e819055505b565b600f5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60009054906101000a900460ff1681565b612126612418565b73ffffffffffffffffffffffffffffffffffffffff16612144611811565b73ffffffffffffffffffffffffffffffffffffffff161461219a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219190614905565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561220a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220190614725565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061239557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806123a557506123a482612c16565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661249383610ead565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006124e4826123ac565b612523576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251a906147c5565b60405180910390fd5b600061252e83610ead565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061259d57508373ffffffffffffffffffffffffffffffffffffffff1661258584610938565b73ffffffffffffffffffffffffffffffffffffffff16145b806125ae57506125ad8185612077565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166125d782610ead565b73ffffffffffffffffffffffffffffffffffffffff161461262d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262490614925565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561269d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269490614785565b60405180910390fd5b6126aa8383836001612c80565b6126b5600082612420565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127059190614c15565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461275c9190614b34565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612823826000836000612c80565b61282e600082612420565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461287e9190614c15565b925050819055506002600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905580600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600081836129299190614b34565b905092915050565b6000818361293f9190614bbb565b905092915050565b612961828260405180602001604052806000815250612daa565b5050565b6129708484846125b7565b61297c84848484612e05565b6129bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b290614705565b60405180910390fd5b50505050565b6060601080546129d090614cff565b80601f01602080910402602001604051908101604052809291908181526020018280546129fc90614cff565b8015612a495780601f10612a1e57610100808354040283529160200191612a49565b820191906000526020600020905b815481529060010190602001808311612a2c57829003601f168201915b5050505050905090565b60606000821415612a9b576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612bfb565b600082905060005b60008214612acd578080612ab690614d31565b915050600a82612ac69190614b8a565b9150612aa3565b60008167ffffffffffffffff811115612b0f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612b415781602001600182028036833780820191505090505b5090505b60008514612bf457600182612b5a9190614c15565b9150600a85612b699190614d7a565b6030612b759190614b34565b60f81b818381518110612bb1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612bed9190614b8a565b9450612b45565b8093505050505b919050565b60008183612c0e9190614c15565b905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612c8c84848484612f9c565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612ccf57612cca82612fa2565b612d0e565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612d0d57612d0c8483612feb565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148015612d475750805b15612d5a57612d5582613158565b612da4565b8373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612d935750805b15612da357612da2838361329b565b5b5b50505050565b612db4838361331a565b612dc16000848484612e05565b612e00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df790614705565b60405180910390fd5b505050565b6000612e268473ffffffffffffffffffffffffffffffffffffffff166134ea565b15612f8f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e4f612418565b8786866040518563ffffffff1660e01b8152600401612e7194939291906145dc565b602060405180830381600087803b158015612e8b57600080fd5b505af1925050508015612ebc57506040513d601f19601f82011682018060405250810190612eb991906138e7565b60015b612f3f573d8060008114612eec576040519150601f19603f3d011682016040523d82523d6000602084013e612ef1565b606091505b50600081511415612f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f2e90614705565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f94565b600190505b949350505050565b50505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612ff88461102a565b6130029190614c15565b90506000600760008481526020019081526020016000205490508181146130e7576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061316c9190614c15565b90506000600960008481526020019081526020016000205490506000600883815481106131c2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811061320a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061327f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006132a68361102a565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561338a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613381906148c5565b60405180910390fd5b613393816123ac565b156133d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ca90614745565b60405180910390fd5b6133e1600083836001612c80565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134319190614b34565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461350990614cff565b90600052602060002090601f01602090048101928261352b5760008555613572565b82601f1061354457805160ff1916838001178555613572565b82800160010185558215613572579182015b82811115613571578251825591602001919060010190613556565b5b50905061357f9190613583565b5090565b5b8082111561359c576000816000905550600101613584565b5090565b60006135b36135ae84614a91565b614a60565b9050828152602081018484840111156135cb57600080fd5b6135d6848285614cbd565b509392505050565b60006135f16135ec84614ac1565b614a60565b90508281526020810184848401111561360957600080fd5b613614848285614cbd565b509392505050565b60008135905061362b81614e78565b92915050565b60008135905061364081614e8f565b92915050565b60008151905061365581614e8f565b92915050565b60008135905061366a81614ea6565b92915050565b60008151905061367f81614ea6565b92915050565b600082601f83011261369657600080fd5b81356136a68482602086016135a0565b91505092915050565b600082601f8301126136c057600080fd5b81356136d08482602086016135de565b91505092915050565b6000813590506136e881614ebd565b92915050565b60006020828403121561370057600080fd5b600061370e8482850161361c565b91505092915050565b6000806040838503121561372a57600080fd5b60006137388582860161361c565b92505060206137498582860161361c565b9150509250929050565b60008060006060848603121561376857600080fd5b60006137768682870161361c565b93505060206137878682870161361c565b9250506040613798868287016136d9565b9150509250925092565b600080600080608085870312156137b857600080fd5b60006137c68782880161361c565b94505060206137d78782880161361c565b93505060406137e8878288016136d9565b925050606085013567ffffffffffffffff81111561380557600080fd5b61381187828801613685565b91505092959194509250565b6000806040838503121561383057600080fd5b600061383e8582860161361c565b925050602061384f85828601613631565b9150509250929050565b6000806040838503121561386c57600080fd5b600061387a8582860161361c565b925050602061388b858286016136d9565b9150509250929050565b6000602082840312156138a757600080fd5b60006138b584828501613646565b91505092915050565b6000602082840312156138d057600080fd5b60006138de8482850161365b565b91505092915050565b6000602082840312156138f957600080fd5b600061390784828501613670565b91505092915050565b60006020828403121561392257600080fd5b600082013567ffffffffffffffff81111561393c57600080fd5b613948848285016136af565b91505092915050565b60006020828403121561396357600080fd5b6000613971848285016136d9565b91505092915050565b60008060006060848603121561398f57600080fd5b600061399d868287016136d9565b93505060206139ae868287016136d9565b92505060406139bf868287016136d9565b9150509250925092565b6139d281614c49565b82525050565b6139e181614c5b565b82525050565b60006139f282614af1565b6139fc8185614b07565b9350613a0c818560208601614ccc565b613a1581614e67565b840191505092915050565b6000613a2b82614afc565b613a358185614b18565b9350613a45818560208601614ccc565b613a4e81614e67565b840191505092915050565b6000613a6482614afc565b613a6e8185614b29565b9350613a7e818560208601614ccc565b80840191505092915050565b6000613a97602383614b18565b91507f5374617274696e6720696e64657820686173206e6f74206265656e207365742060008301527f79657400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613afd603383614b18565b91507f4e756d626572206f6620746f6b656e732063616e206e6f74206265206c65737360008301527f207468616e206f7220657175616c20746f2030000000000000000000000000006020830152604082019050919050565b6000613b63601583614b18565b91507f447261676f6e20636f6d706f7365206661696c656400000000000000000000006000830152602082019050919050565b6000613ba3602583614b18565b91507f4552433732313a20757365206f6620746f6b656e332074686174206973206e6f60008301527f74206f776e0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c09602b83614b18565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613c6f603283614b18565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613cd5602683614b18565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d3b601c83614b18565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613d7b602383614b18565b91507f43616e206f6e6c79206d696e7420757020746f2031302070657220707572636860008301527f61736500000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613de1602483614b18565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e47601983614b18565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613e87602c83614b18565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613eed601d83614b18565b91507f5374617274696e6720696e64657820697320616c7265616479207365740000006000830152602082019050919050565b6000613f2d603883614b18565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613f93602a83614b18565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ff9602983614b18565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061405f602383614b18565b91507f447261676f6e20636f6e74726163742061646472657373206e6565642062652060008301527f73657400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006140c5601d83614b18565b91507f53656e742065746865722076616c756520697320696e636f72726563740000006000830152602082019050919050565b6000614105602083614b18565b91507f507572636861736520776f756c6420657863656564206d617820737570706c796000830152602082019050919050565b6000614145602083614b18565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614185602c83614b18565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006141eb602083614b18565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061422b602983614b18565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614291602f83614b18565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006142f7602183614b18565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061435d603183614b18565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006143c3602c83614b18565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000614429602383614b18565b91507f5374617274696e6720696e6465782068617320616c7265616479206265656e2060008301527f73657400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061448f602583614b18565b91507f4552433732313a20757365206f6620746f6b656e312074686174206973206e6f60008301527f74206f776e0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006144f5602583614b18565b91507f4552433732313a20757365206f6620746f6b656e322074686174206973206e6f60008301527f74206f776e0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061455b602083614b18565b91507f53616c65206973206e6f742061637469766520617420746865206d6f6d656e746000830152602082019050919050565b61459781614cb3565b82525050565b60006145a98285613a59565b91506145b58284613a59565b91508190509392505050565b60006020820190506145d660008301846139c9565b92915050565b60006080820190506145f160008301876139c9565b6145fe60208301866139c9565b61460b604083018561458e565b818103606083015261461d81846139e7565b905095945050505050565b600060208201905061463d60008301846139d8565b92915050565b6000602082019050818103600083015261465d8184613a20565b905092915050565b6000602082019050818103600083015261467e81613a8a565b9050919050565b6000602082019050818103600083015261469e81613af0565b9050919050565b600060208201905081810360008301526146be81613b56565b9050919050565b600060208201905081810360008301526146de81613b96565b9050919050565b600060208201905081810360008301526146fe81613bfc565b9050919050565b6000602082019050818103600083015261471e81613c62565b9050919050565b6000602082019050818103600083015261473e81613cc8565b9050919050565b6000602082019050818103600083015261475e81613d2e565b9050919050565b6000602082019050818103600083015261477e81613d6e565b9050919050565b6000602082019050818103600083015261479e81613dd4565b9050919050565b600060208201905081810360008301526147be81613e3a565b9050919050565b600060208201905081810360008301526147de81613e7a565b9050919050565b600060208201905081810360008301526147fe81613ee0565b9050919050565b6000602082019050818103600083015261481e81613f20565b9050919050565b6000602082019050818103600083015261483e81613f86565b9050919050565b6000602082019050818103600083015261485e81613fec565b9050919050565b6000602082019050818103600083015261487e81614052565b9050919050565b6000602082019050818103600083015261489e816140b8565b9050919050565b600060208201905081810360008301526148be816140f8565b9050919050565b600060208201905081810360008301526148de81614138565b9050919050565b600060208201905081810360008301526148fe81614178565b9050919050565b6000602082019050818103600083015261491e816141de565b9050919050565b6000602082019050818103600083015261493e8161421e565b9050919050565b6000602082019050818103600083015261495e81614284565b9050919050565b6000602082019050818103600083015261497e816142ea565b9050919050565b6000602082019050818103600083015261499e81614350565b9050919050565b600060208201905081810360008301526149be816143b6565b9050919050565b600060208201905081810360008301526149de8161441c565b9050919050565b600060208201905081810360008301526149fe81614482565b9050919050565b60006020820190508181036000830152614a1e816144e8565b9050919050565b60006020820190508181036000830152614a3e8161454e565b9050919050565b6000602082019050614a5a600083018461458e565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614a8757614a86614e38565b5b8060405250919050565b600067ffffffffffffffff821115614aac57614aab614e38565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614adc57614adb614e38565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614b3f82614cb3565b9150614b4a83614cb3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b7f57614b7e614dab565b5b828201905092915050565b6000614b9582614cb3565b9150614ba083614cb3565b925082614bb057614baf614dda565b5b828204905092915050565b6000614bc682614cb3565b9150614bd183614cb3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614c0a57614c09614dab565b5b828202905092915050565b6000614c2082614cb3565b9150614c2b83614cb3565b925082821015614c3e57614c3d614dab565b5b828203905092915050565b6000614c5482614c93565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614cea578082015181840152602081019050614ccf565b83811115614cf9576000848401525b50505050565b60006002820490506001821680614d1757607f821691505b60208210811415614d2b57614d2a614e09565b5b50919050565b6000614d3c82614cb3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614d6f57614d6e614dab565b5b600182019050919050565b6000614d8582614cb3565b9150614d9083614cb3565b925082614da057614d9f614dda565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b614e8181614c49565b8114614e8c57600080fd5b50565b614e9881614c5b565b8114614ea357600080fd5b50565b614eaf81614c67565b8114614eba57600080fd5b50565b614ec681614cb3565b8114614ed157600080fd5b5056fea264697066735822122084591db8de77eccbbf29e81f63ddf9672c8d94d4bf0611eaba7cafbe7412377464736f6c63430008000033
Deployed Bytecode Sourcemap
49208:5219:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43007:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49466:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30929:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32381:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31918:397;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43656:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33271:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43324:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49515:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49959:89;;;;;;;;;;;;;:::i;:::-;;50056:140;;;;;;;;;;;;;:::i;:::-;;33647:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43846:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53514:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30623:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49824:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49394:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30353:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28189:148;;;;;;;;;;;;;:::i;:::-;;51159:460;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53120:182;;;;;;;;;;;;;:::i;:::-;;51627:780;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27538:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31098:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49358:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50525:626;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32674:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33869:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53631:793;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49596:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50204:313;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52415:697;;;;;;;;;;;;;:::i;:::-;;49631:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33040:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49555:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28492:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43007:233;43109:4;43148:35;43133:50;;;:11;:50;;;;:99;;;;43196:36;43220:11;43196:23;:36::i;:::-;43133:99;43126:106;;43007:233;;;:::o;49466:42::-;49506:2;49466:42;:::o;30929:100::-;30983:13;31016:5;31009:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30929:100;:::o;32381:221::-;32457:7;32485:16;32493:7;32485;:16::i;:::-;32477:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32570:15;:24;32586:7;32570:24;;;;;;;;;;;;;;;;;;;;;32563:31;;32381:221;;;:::o;31918:397::-;31999:13;32015:23;32030:7;32015:14;:23::i;:::-;31999:39;;32063:5;32057:11;;:2;:11;;;;32049:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;32143:5;32127:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;32152:37;32169:5;32176:12;:10;:12::i;:::-;32152:16;:37::i;:::-;32127:62;32119:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;32286:21;32295:2;32299:7;32286:8;:21::i;:::-;31918:397;;;:::o;43656:113::-;43717:7;43744:10;:17;;;;43737:24;;43656:113;:::o;33271:305::-;33432:41;33451:12;:10;:12::i;:::-;33465:7;33432:18;:41::i;:::-;33424:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33540:28;33550:4;33556:2;33560:7;33540:9;:28::i;:::-;33271:305;;;:::o;43324:256::-;43421:7;43457:23;43474:5;43457:16;:23::i;:::-;43449:5;:31;43441:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;43546:12;:19;43559:5;43546:19;;;;;;;;;;;;;;;:26;43566:5;43546:26;;;;;;;;;;;;43539:33;;43324:256;;;;:::o;49515:33::-;;;;:::o;49959:89::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50028:12:::1;;;;;;;;;;;50027:13;50012:12;;:28;;;;;;;;;;;;;;;;;;49959:89::o:0;50056:140::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50104:12:::1;50119:21;50104:36;;50159:10;50151:28;;:37;50180:7;50151:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;27829:1;50056:140::o:0;33647:151::-;33751:39;33768:4;33774:2;33778:7;33751:39;;;;;;;;;;;;:16;:39::i;:::-;33647:151;;;:::o;43846:233::-;43921:7;43957:30;:28;:30::i;:::-;43949:5;:38;43941:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;44054:10;44065:5;44054:17;;;;;;;;;;;;;;;;;;;;;;;;44047:24;;43846:233;;;:::o;53514:109::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53607:8:::1;53588:16;:27;;;;;;;;;;;;:::i;:::-;;53514:109:::0;:::o;30623:239::-;30695:7;30715:13;30731:7;:16;30739:7;30731:16;;;;;;;;;;;;;;;;;;;;;30715:32;;30783:1;30766:19;;:5;:19;;;;30758:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30849:5;30842:12;;;30623:239;;;:::o;49824:127::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49928:15:::1;49911:14;;:32;;;;;;;;;;;;;;;;;;49824:127:::0;:::o;49394:53::-;49430:17;49394:53;:::o;30353:208::-;30425:7;30470:1;30453:19;;:5;:19;;;;30445:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;30537:9;:16;30547:5;30537:16;;;;;;;;;;;;;;;;30530:23;;30353:208;;;:::o;28189:148::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28296:1:::1;28259:40;;28280:6;;;;;;;;;;;28259:40;;;;;;;;;;;;28327:1;28310:6;;:19;;;;;;;;;;;;;;;;;;28189:148::o:0;51159:460::-;51245:1;51219:28;;:14;;;;;;;;;;;:28;;;;51211:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;51300:12;51315:10;51300:25;;51375:4;51344:35;;:27;51359:11;51344:14;:27::i;:::-;:35;;;51336:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;51434:28;51444:4;51450:11;51434:9;:28::i;:::-;51475:13;51498:14;;;;;;;;;;;51475:38;;51524:11;51538:6;:16;;;51555:4;51538:22;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51524:36;;51579:6;51571:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;51159:460;;;;:::o;53120:182::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53215:1:::1;53198:13;;:18;53190:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;53282:12;53261:18;:33;;;;53120:182::o:0;51627:780::-;51759:1;51733:28;;:14;;;;;;;;;;;:28;;;;51725:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;51814:12;51829:10;51814:25;;51889:4;51858:35;;:27;51873:11;51858:14;:27::i;:::-;:35;;;51850:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;51985:4;51954:35;;:27;51969:11;51954:14;:27::i;:::-;:35;;;51946:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;52081:4;52050:35;;:27;52065:11;52050:14;:27::i;:::-;:35;;;52042:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;52140:28;52150:4;52156:11;52140:9;:28::i;:::-;52179;52189:4;52195:11;52179:9;:28::i;:::-;52218;52228:4;52234:11;52218:9;:28::i;:::-;52259:13;52282:14;;;;;;;;;;;52259:38;;52308:11;52322:6;:20;;;52343:4;52322:26;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52308:40;;52367:6;52359:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;51627:780;;;;;;:::o;27538:87::-;27584:7;27611:6;;;;;;;;;;;27604:13;;27538:87;:::o;31098:104::-;31154:13;31187:7;31180:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31098:104;:::o;49358:29::-;;;;;;;;;;;;;:::o;50525:626::-;50594:12;;;;;;;;;;;50586:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;50679:1;50662:14;:18;50654:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;50792:10;;50755:33;50773:14;50755:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:47;;50747:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;49506:2;50858:14;:34;;50850:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;50983:9;50950:29;50964:14;49430:17;50950:13;;:29;;;;:::i;:::-;:42;50942:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;51044:6;51039:105;51060:14;51056:1;:18;51039:105;;;51096:36;51106:10;51118:13;:11;:13::i;:::-;51096:9;:36::i;:::-;51076:3;;;;;:::i;:::-;;;;51039:105;;;;50525:626;:::o;32674:295::-;32789:12;:10;:12::i;:::-;32777:24;;:8;:24;;;;32769:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;32889:8;32844:18;:32;32863:12;:10;:12::i;:::-;32844:32;;;;;;;;;;;;;;;:42;32877:8;32844:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;32942:8;32913:48;;32928:12;:10;:12::i;:::-;32913:48;;;32952:8;32913:48;;;;;;:::i;:::-;;;;;;;;32674:295;;:::o;33869:285::-;34001:41;34020:12;:10;:12::i;:::-;34034:7;34001:18;:41::i;:::-;33993:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;34107:39;34121:4;34127:2;34131:7;34140:5;34107:13;:39::i;:::-;33869:285;;;;:::o;53631:793::-;53704:13;53738:16;53746:7;53738;:16::i;:::-;53730:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;53819:23;53845:10;:19;53856:7;53845:19;;;;;;;;;;;53819:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53875:18;53896:10;:8;:10::i;:::-;53875:31;;54004:1;53988:4;53982:18;:23;53978:72;;;54029:9;54022:16;;;;;;53978:72;54180:1;54160:9;54154:23;:27;54150:108;;;54229:4;54235:9;54212:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54198:48;;;;;;54150:108;54390:4;54396:18;:7;:16;:18::i;:::-;54373:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54359:57;;;;53631:793;;;;:::o;49596:28::-;;;;:::o;50204:313::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50268:11:::1;50282:13;:11;:13::i;:::-;50268:27;;50306:6;50323:86;50339:3;50335:1;:7;50323:86;;;50364:33;50374:10;50395:1;50386:6;:10;;;;:::i;:::-;50364:9;:33::i;:::-;50344:3;;;;;:::i;:::-;;;;50323:86;;;50447:1;50425:18;;:23;50421:89;;;50486:12;50465:18;:33;;;;50421:89;27829:1;;50204:313:::0;:::o;52415:697::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52497:1:::1;52480:13;;:18;52472:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;52579:1;52557:18;;:23;;52549:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;52687:10;;52664:18;;52654:29;52649:35;;:48;;;;:::i;:::-;52633:13;:64;;;;52871:3;52832:36;52849:18;;52832:12;:16;;:36;;;;:::i;:::-;:42;52829:136;;;52943:10;;52937:1;52922:12;:16;;;;:::i;:::-;52912:27;52907:33;;:46;;;;:::i;:::-;52891:13;:62;;;;52829:136;53039:1;53022:13;;:18;53018:87;;;53073:20;53091:1;53073:13;;:17;;:20;;;;:::i;:::-;53057:13;:36;;;;53018:87;52415:697::o:0;49631:33::-;;;;:::o;33040:164::-;33137:4;33161:18;:25;33180:5;33161:25;;;;;;;;;;;;;;;:35;33187:8;33161:35;;;;;;;;;;;;;;;;;;;;;;;;;33154:42;;33040:164;;;;:::o;49555:32::-;;;;;;;;;;;;;:::o;28492:244::-;27769:12;:10;:12::i;:::-;27758:23;;:7;:5;:7::i;:::-;:23;;;27750:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28601:1:::1;28581:22;;:8;:22;;;;28573:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28691:8;28662:38;;28683:6;;;;;;;;;;;28662:38;;;;;;;;;;;;28720:8;28711:6;;:17;;;;;;;;;;;;;;;;;;28492:244:::0;:::o;30005:284::-;30107:4;30146:25;30131:40;;;:11;:40;;;;:101;;;;30199:33;30184:48;;;:11;:48;;;;30131:101;:150;;;;30245:36;30269:11;30245:23;:36::i;:::-;30131:150;30124:157;;30005:284;;;:::o;35621:127::-;35686:4;35738:1;35710:30;;:7;:16;35718:7;35710:16;;;;;;;;;;;;;;;;;;;;;:30;;;;35703:37;;35621:127;;;:::o;26155:98::-;26208:7;26235:10;26228:17;;26155:98;:::o;39860:174::-;39962:2;39935:15;:24;39951:7;39935:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;40018:7;40014:2;39980:46;;39989:23;40004:7;39989:14;:23::i;:::-;39980:46;;;;;;;;;;;;39860:174;;:::o;35915:348::-;36008:4;36033:16;36041:7;36033;:16::i;:::-;36025:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36109:13;36125:23;36140:7;36125:14;:23::i;:::-;36109:39;;36178:5;36167:16;;:7;:16;;;:51;;;;36211:7;36187:31;;:20;36199:7;36187:11;:20::i;:::-;:31;;;36167:51;:87;;;;36222:32;36239:5;36246:7;36222:16;:32::i;:::-;36167:87;36159:96;;;35915:348;;;;:::o;39192:550::-;39317:4;39290:31;;:23;39305:7;39290:14;:23::i;:::-;:31;;;39282:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;39400:1;39386:16;;:2;:16;;;;39378:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;39456:45;39477:4;39483:2;39487:7;39496:4;39456:20;:45::i;:::-;39566:29;39583:1;39587:7;39566:8;:29::i;:::-;39627:1;39608:9;:15;39618:4;39608:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;39656:1;39639:9;:13;39649:2;39639:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39687:2;39668:7;:16;39676:7;39668:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39726:7;39722:2;39707:27;;39716:4;39707:27;;;;;;;;;;;;39192:550;;;:::o;38519:336::-;38600:55;38621:5;38636:1;38640:7;38649:5;38600:20;:55::i;:::-;38696:29;38713:1;38717:7;38696:8;:29::i;:::-;38758:1;38738:9;:16;38748:5;38738:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;38777:7;:16;38785:7;38777:16;;;;;;;;;;;;38770:23;;;;;;;;;;;38839:7;38835:1;38811:36;;38820:5;38811:36;;;;;;;;;;;;38519:336;;:::o;2659:98::-;2717:7;2748:1;2744;:5;;;;:::i;:::-;2737:12;;2659:98;;;;:::o;3397:::-;3455:7;3486:1;3482;:5;;;;:::i;:::-;3475:12;;3397:98;;;;:::o;36605:110::-;36681:26;36691:2;36695:7;36681:26;;;;;;;;;;;;:9;:26::i;:::-;36605:110;;:::o;35036:272::-;35150:28;35160:4;35166:2;35170:7;35150:9;:28::i;:::-;35197:48;35220:4;35226:2;35230:7;35239:5;35197:22;:48::i;:::-;35189:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;35036:272;;;;:::o;53310:117::-;53370:13;53403:16;53396:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53310:117;:::o;7152:723::-;7208:13;7438:1;7429:5;:10;7425:53;;;7456:10;;;;;;;;;;;;;;;;;;;;;7425:53;7488:12;7503:5;7488:20;;7519:14;7544:78;7559:1;7551:4;:9;7544:78;;7577:8;;;;;:::i;:::-;;;;7608:2;7600:10;;;;;:::i;:::-;;;7544:78;;;7632:19;7664:6;7654:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7632:39;;7682:154;7698:1;7689:5;:10;7682:154;;7726:1;7716:11;;;;;:::i;:::-;;;7793:2;7785:5;:10;;;;:::i;:::-;7772:2;:24;;;;:::i;:::-;7759:39;;7742:6;7749;7742:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;7822:2;7813:11;;;;;:::i;:::-;;;7682:154;;;7860:6;7846:21;;;;;7152:723;;;;:::o;3040:98::-;3098:7;3129:1;3125;:5;;;;:::i;:::-;3118:12;;3040:98;;;;:::o;19228:157::-;19313:4;19352:25;19337:40;;;:11;:40;;;;19330:47;;19228:157;;;:::o;44692:604::-;44817:55;44844:4;44850:2;44854:7;44863:8;44817:26;:55::i;:::-;44905:1;44889:18;;:4;:18;;;44885:187;;;44924:40;44956:7;44924:31;:40::i;:::-;44885:187;;;44994:2;44986:10;;:4;:10;;;44982:90;;45013:47;45046:4;45052:7;45013:32;:47::i;:::-;44982:90;44885:187;45100:1;45086:16;;:2;:16;;;:28;;;;;45106:8;45086:28;45082:207;;;45131:45;45168:7;45131:36;:45::i;:::-;45082:207;;;45204:4;45198:10;;:2;:10;;;;:22;;;;;45212:8;45198:22;45194:95;;;45237:40;45265:2;45269:7;45237:27;:40::i;:::-;45194:95;45082:207;44692:604;;;;:::o;36942:250::-;37038:18;37044:2;37048:7;37038:5;:18::i;:::-;37075:54;37106:1;37110:2;37114:7;37123:5;37075:22;:54::i;:::-;37067:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;36942:250;;;:::o;40599:839::-;40716:4;40742:15;:2;:13;;;:15::i;:::-;40738:693;;;40794:2;40778:36;;;40815:12;:10;:12::i;:::-;40829:4;40835:7;40844:5;40778:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40774:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41041:1;41024:6;:13;:18;41020:341;;;41067:60;;;;;;;;;;:::i;:::-;;;;;;;;41020:341;41311:6;41305:13;41296:6;41292:2;41288:15;41281:38;40774:602;40911:45;;;40901:55;;;:6;:55;;;;40894:62;;;;;40738:693;41415:4;41408:11;;40599:839;;;;;;;:::o;42051:108::-;;;;;:::o;46019:164::-;46123:10;:17;;;;46096:15;:24;46112:7;46096:24;;;;;;;;;;;:44;;;;46151:10;46167:7;46151:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46019:164;:::o;46810:988::-;47076:22;47126:1;47101:22;47118:4;47101:16;:22::i;:::-;:26;;;;:::i;:::-;47076:51;;47138:18;47159:17;:26;47177:7;47159:26;;;;;;;;;;;;47138:47;;47306:14;47292:10;:28;47288:328;;47337:19;47359:12;:18;47372:4;47359:18;;;;;;;;;;;;;;;:34;47378:14;47359:34;;;;;;;;;;;;47337:56;;47443:11;47410:12;:18;47423:4;47410:18;;;;;;;;;;;;;;;:30;47429:10;47410:30;;;;;;;;;;;:44;;;;47560:10;47527:17;:30;47545:11;47527:30;;;;;;;;;;;:43;;;;47288:328;;47712:17;:26;47730:7;47712:26;;;;;;;;;;;47705:33;;;47756:12;:18;47769:4;47756:18;;;;;;;;;;;;;;;:34;47775:14;47756:34;;;;;;;;;;;47749:41;;;46810:988;;;;:::o;48093:1079::-;48346:22;48391:1;48371:10;:17;;;;:21;;;;:::i;:::-;48346:46;;48403:18;48424:15;:24;48440:7;48424:24;;;;;;;;;;;;48403:45;;48775:19;48797:10;48808:14;48797:26;;;;;;;;;;;;;;;;;;;;;;;;48775:48;;48861:11;48836:10;48847;48836:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;48972:10;48941:15;:28;48957:11;48941:28;;;;;;;;;;;:41;;;;49113:15;:24;49129:7;49113:24;;;;;;;;;;;49106:31;;;49148:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48093:1079;;;;:::o;45597:221::-;45682:14;45699:20;45716:2;45699:16;:20::i;:::-;45682:37;;45757:7;45730:12;:16;45743:2;45730:16;;;;;;;;;;;;;;;:24;45747:6;45730:24;;;;;;;;;;;:34;;;;45804:6;45775:17;:26;45793:7;45775:26;;;;;;;;;;;:35;;;;45597:221;;;:::o;37528:388::-;37622:1;37608:16;;:2;:16;;;;37600:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;37681:16;37689:7;37681;:16::i;:::-;37680:17;37672:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37743:51;37772:1;37776:2;37780:7;37789:4;37743:20;:51::i;:::-;37824:1;37807:9;:13;37817:2;37807:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37855:2;37836:7;:16;37844:7;37836:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37900:7;37896:2;37875:33;;37892:1;37875:33;;;;;;;;;;;;37528:388;;:::o;9617:422::-;9677:4;9885:12;9996:7;9984:20;9976:28;;10030:1;10023:4;:8;10016:15;;;9617:422;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1074:6;1068:13;1059:22;;1090:30;1114:5;1090:30;:::i;:::-;1049:77;;;;:::o;1132:137::-;;1215:6;1202:20;1193:29;;1231:32;1257:5;1231:32;:::i;:::-;1183:86;;;;:::o;1275:141::-;;1362:6;1356:13;1347:22;;1378:32;1404:5;1378:32;:::i;:::-;1337:79;;;;:::o;1435:271::-;;1539:3;1532:4;1524:6;1520:17;1516:27;1506:2;;1557:1;1554;1547:12;1506:2;1597:6;1584:20;1622:78;1696:3;1688:6;1681:4;1673:6;1669:17;1622:78;:::i;:::-;1613:87;;1496:210;;;;;:::o;1726:273::-;;1831:3;1824:4;1816:6;1812:17;1808:27;1798:2;;1849:1;1846;1839:12;1798:2;1889:6;1876:20;1914:79;1989:3;1981:6;1974:4;1966:6;1962:17;1914:79;:::i;:::-;1905:88;;1788:211;;;;;:::o;2005:139::-;;2089:6;2076:20;2067:29;;2105:33;2132:5;2105:33;:::i;:::-;2057:87;;;;:::o;2150:262::-;;2258:2;2246:9;2237:7;2233:23;2229:32;2226:2;;;2274:1;2271;2264:12;2226:2;2317:1;2342:53;2387:7;2378:6;2367:9;2363:22;2342:53;:::i;:::-;2332:63;;2288:117;2216:196;;;;:::o;2418:407::-;;;2543:2;2531:9;2522:7;2518:23;2514:32;2511:2;;;2559:1;2556;2549:12;2511:2;2602:1;2627:53;2672:7;2663:6;2652:9;2648:22;2627:53;:::i;:::-;2617:63;;2573:117;2729:2;2755:53;2800:7;2791:6;2780:9;2776:22;2755:53;:::i;:::-;2745:63;;2700:118;2501:324;;;;;:::o;2831:552::-;;;;2973:2;2961:9;2952:7;2948:23;2944:32;2941:2;;;2989:1;2986;2979:12;2941:2;3032:1;3057:53;3102:7;3093:6;3082:9;3078:22;3057:53;:::i;:::-;3047:63;;3003:117;3159:2;3185:53;3230:7;3221:6;3210:9;3206:22;3185:53;:::i;:::-;3175:63;;3130:118;3287:2;3313:53;3358:7;3349:6;3338:9;3334:22;3313:53;:::i;:::-;3303:63;;3258:118;2931:452;;;;;:::o;3389:809::-;;;;;3557:3;3545:9;3536:7;3532:23;3528:33;3525:2;;;3574:1;3571;3564:12;3525:2;3617:1;3642:53;3687:7;3678:6;3667:9;3663:22;3642:53;:::i;:::-;3632:63;;3588:117;3744:2;3770:53;3815:7;3806:6;3795:9;3791:22;3770:53;:::i;:::-;3760:63;;3715:118;3872:2;3898:53;3943:7;3934:6;3923:9;3919:22;3898:53;:::i;:::-;3888:63;;3843:118;4028:2;4017:9;4013:18;4000:32;4059:18;4051:6;4048:30;4045:2;;;4091:1;4088;4081:12;4045:2;4119:62;4173:7;4164:6;4153:9;4149:22;4119:62;:::i;:::-;4109:72;;3971:220;3515:683;;;;;;;:::o;4204:401::-;;;4326:2;4314:9;4305:7;4301:23;4297:32;4294:2;;;4342:1;4339;4332:12;4294:2;4385:1;4410:53;4455:7;4446:6;4435:9;4431:22;4410:53;:::i;:::-;4400:63;;4356:117;4512:2;4538:50;4580:7;4571:6;4560:9;4556:22;4538:50;:::i;:::-;4528:60;;4483:115;4284:321;;;;;:::o;4611:407::-;;;4736:2;4724:9;4715:7;4711:23;4707:32;4704:2;;;4752:1;4749;4742:12;4704:2;4795:1;4820:53;4865:7;4856:6;4845:9;4841:22;4820:53;:::i;:::-;4810:63;;4766:117;4922:2;4948:53;4993:7;4984:6;4973:9;4969:22;4948:53;:::i;:::-;4938:63;;4893:118;4694:324;;;;;:::o;5024:278::-;;5140:2;5128:9;5119:7;5115:23;5111:32;5108:2;;;5156:1;5153;5146:12;5108:2;5199:1;5224:61;5277:7;5268:6;5257:9;5253:22;5224:61;:::i;:::-;5214:71;;5170:125;5098:204;;;;:::o;5308:260::-;;5415:2;5403:9;5394:7;5390:23;5386:32;5383:2;;;5431:1;5428;5421:12;5383:2;5474:1;5499:52;5543:7;5534:6;5523:9;5519:22;5499:52;:::i;:::-;5489:62;;5445:116;5373:195;;;;:::o;5574:282::-;;5692:2;5680:9;5671:7;5667:23;5663:32;5660:2;;;5708:1;5705;5698:12;5660:2;5751:1;5776:63;5831:7;5822:6;5811:9;5807:22;5776:63;:::i;:::-;5766:73;;5722:127;5650:206;;;;:::o;5862:375::-;;5980:2;5968:9;5959:7;5955:23;5951:32;5948:2;;;5996:1;5993;5986:12;5948:2;6067:1;6056:9;6052:17;6039:31;6097:18;6089:6;6086:30;6083:2;;;6129:1;6126;6119:12;6083:2;6157:63;6212:7;6203:6;6192:9;6188:22;6157:63;:::i;:::-;6147:73;;6010:220;5938:299;;;;:::o;6243:262::-;;6351:2;6339:9;6330:7;6326:23;6322:32;6319:2;;;6367:1;6364;6357:12;6319:2;6410:1;6435:53;6480:7;6471:6;6460:9;6456:22;6435:53;:::i;:::-;6425:63;;6381:117;6309:196;;;;:::o;6511:552::-;;;;6653:2;6641:9;6632:7;6628:23;6624:32;6621:2;;;6669:1;6666;6659:12;6621:2;6712:1;6737:53;6782:7;6773:6;6762:9;6758:22;6737:53;:::i;:::-;6727:63;;6683:117;6839:2;6865:53;6910:7;6901:6;6890:9;6886:22;6865:53;:::i;:::-;6855:63;;6810:118;6967:2;6993:53;7038:7;7029:6;7018:9;7014:22;6993:53;:::i;:::-;6983:63;;6938:118;6611:452;;;;;:::o;7069:118::-;7156:24;7174:5;7156:24;:::i;:::-;7151:3;7144:37;7134:53;;:::o;7193:109::-;7274:21;7289:5;7274:21;:::i;:::-;7269:3;7262:34;7252:50;;:::o;7308:360::-;;7422:38;7454:5;7422:38;:::i;:::-;7476:70;7539:6;7534:3;7476:70;:::i;:::-;7469:77;;7555:52;7600:6;7595:3;7588:4;7581:5;7577:16;7555:52;:::i;:::-;7632:29;7654:6;7632:29;:::i;:::-;7627:3;7623:39;7616:46;;7398:270;;;;;:::o;7674:364::-;;7790:39;7823:5;7790:39;:::i;:::-;7845:71;7909:6;7904:3;7845:71;:::i;:::-;7838:78;;7925:52;7970:6;7965:3;7958:4;7951:5;7947:16;7925:52;:::i;:::-;8002:29;8024:6;8002:29;:::i;:::-;7997:3;7993:39;7986:46;;7766:272;;;;;:::o;8044:377::-;;8178:39;8211:5;8178:39;:::i;:::-;8233:89;8315:6;8310:3;8233:89;:::i;:::-;8226:96;;8331:52;8376:6;8371:3;8364:4;8357:5;8353:16;8331:52;:::i;:::-;8408:6;8403:3;8399:16;8392:23;;8154:267;;;;;:::o;8427:367::-;;8590:67;8654:2;8649:3;8590:67;:::i;:::-;8583:74;;8687:34;8683:1;8678:3;8674:11;8667:55;8753:5;8748:2;8743:3;8739:12;8732:27;8785:2;8780:3;8776:12;8769:19;;8573:221;;;:::o;8800:383::-;;8963:67;9027:2;9022:3;8963:67;:::i;:::-;8956:74;;9060:34;9056:1;9051:3;9047:11;9040:55;9126:21;9121:2;9116:3;9112:12;9105:43;9174:2;9169:3;9165:12;9158:19;;8946:237;;;:::o;9189:319::-;;9352:67;9416:2;9411:3;9352:67;:::i;:::-;9345:74;;9449:23;9445:1;9440:3;9436:11;9429:44;9499:2;9494:3;9490:12;9483:19;;9335:173;;;:::o;9514:369::-;;9677:67;9741:2;9736:3;9677:67;:::i;:::-;9670:74;;9774:34;9770:1;9765:3;9761:11;9754:55;9840:7;9835:2;9830:3;9826:12;9819:29;9874:2;9869:3;9865:12;9858:19;;9660:223;;;:::o;9889:375::-;;10052:67;10116:2;10111:3;10052:67;:::i;:::-;10045:74;;10149:34;10145:1;10140:3;10136:11;10129:55;10215:13;10210:2;10205:3;10201:12;10194:35;10255:2;10250:3;10246:12;10239:19;;10035:229;;;:::o;10270:382::-;;10433:67;10497:2;10492:3;10433:67;:::i;:::-;10426:74;;10530:34;10526:1;10521:3;10517:11;10510:55;10596:20;10591:2;10586:3;10582:12;10575:42;10643:2;10638:3;10634:12;10627:19;;10416:236;;;:::o;10658:370::-;;10821:67;10885:2;10880:3;10821:67;:::i;:::-;10814:74;;10918:34;10914:1;10909:3;10905:11;10898:55;10984:8;10979:2;10974:3;10970:12;10963:30;11019:2;11014:3;11010:12;11003:19;;10804:224;;;:::o;11034:326::-;;11197:67;11261:2;11256:3;11197:67;:::i;:::-;11190:74;;11294:30;11290:1;11285:3;11281:11;11274:51;11351:2;11346:3;11342:12;11335:19;;11180:180;;;:::o;11366:367::-;;11529:67;11593:2;11588:3;11529:67;:::i;:::-;11522:74;;11626:34;11622:1;11617:3;11613:11;11606:55;11692:5;11687:2;11682:3;11678:12;11671:27;11724:2;11719:3;11715:12;11708:19;;11512:221;;;:::o;11739:368::-;;11902:67;11966:2;11961:3;11902:67;:::i;:::-;11895:74;;11999:34;11995:1;11990:3;11986:11;11979:55;12065:6;12060:2;12055:3;12051:12;12044:28;12098:2;12093:3;12089:12;12082:19;;11885:222;;;:::o;12113:323::-;;12276:67;12340:2;12335:3;12276:67;:::i;:::-;12269:74;;12373:27;12369:1;12364:3;12360:11;12353:48;12427:2;12422:3;12418:12;12411:19;;12259:177;;;:::o;12442:376::-;;12605:67;12669:2;12664:3;12605:67;:::i;:::-;12598:74;;12702:34;12698:1;12693:3;12689:11;12682:55;12768:14;12763:2;12758:3;12754:12;12747:36;12809:2;12804:3;12800:12;12793:19;;12588:230;;;:::o;12824:327::-;;12987:67;13051:2;13046:3;12987:67;:::i;:::-;12980:74;;13084:31;13080:1;13075:3;13071:11;13064:52;13142:2;13137:3;13133:12;13126:19;;12970:181;;;:::o;13157:388::-;;13320:67;13384:2;13379:3;13320:67;:::i;:::-;13313:74;;13417:34;13413:1;13408:3;13404:11;13397:55;13483:26;13478:2;13473:3;13469:12;13462:48;13536:2;13531:3;13527:12;13520:19;;13303:242;;;:::o;13551:374::-;;13714:67;13778:2;13773:3;13714:67;:::i;:::-;13707:74;;13811:34;13807:1;13802:3;13798:11;13791:55;13877:12;13872:2;13867:3;13863:12;13856:34;13916:2;13911:3;13907:12;13900:19;;13697:228;;;:::o;13931:373::-;;14094:67;14158:2;14153:3;14094:67;:::i;:::-;14087:74;;14191:34;14187:1;14182:3;14178:11;14171:55;14257:11;14252:2;14247:3;14243:12;14236:33;14295:2;14290:3;14286:12;14279:19;;14077:227;;;:::o;14310:367::-;;14473:67;14537:2;14532:3;14473:67;:::i;:::-;14466:74;;14570:34;14566:1;14561:3;14557:11;14550:55;14636:5;14631:2;14626:3;14622:12;14615:27;14668:2;14663:3;14659:12;14652:19;;14456:221;;;:::o;14683:327::-;;14846:67;14910:2;14905:3;14846:67;:::i;:::-;14839:74;;14943:31;14939:1;14934:3;14930:11;14923:52;15001:2;14996:3;14992:12;14985:19;;14829:181;;;:::o;15016:330::-;;15179:67;15243:2;15238:3;15179:67;:::i;:::-;15172:74;;15276:34;15272:1;15267:3;15263:11;15256:55;15337:2;15332:3;15328:12;15321:19;;15162:184;;;:::o;15352:330::-;;15515:67;15579:2;15574:3;15515:67;:::i;:::-;15508:74;;15612:34;15608:1;15603:3;15599:11;15592:55;15673:2;15668:3;15664:12;15657:19;;15498:184;;;:::o;15688:376::-;;15851:67;15915:2;15910:3;15851:67;:::i;:::-;15844:74;;15948:34;15944:1;15939:3;15935:11;15928:55;16014:14;16009:2;16004:3;16000:12;15993:36;16055:2;16050:3;16046:12;16039:19;;15834:230;;;:::o;16070:330::-;;16233:67;16297:2;16292:3;16233:67;:::i;:::-;16226:74;;16330:34;16326:1;16321:3;16317:11;16310:55;16391:2;16386:3;16382:12;16375:19;;16216:184;;;:::o;16406:373::-;;16569:67;16633:2;16628:3;16569:67;:::i;:::-;16562:74;;16666:34;16662:1;16657:3;16653:11;16646:55;16732:11;16727:2;16722:3;16718:12;16711:33;16770:2;16765:3;16761:12;16754:19;;16552:227;;;:::o;16785:379::-;;16948:67;17012:2;17007:3;16948:67;:::i;:::-;16941:74;;17045:34;17041:1;17036:3;17032:11;17025:55;17111:17;17106:2;17101:3;17097:12;17090:39;17155:2;17150:3;17146:12;17139:19;;16931:233;;;:::o;17170:365::-;;17333:67;17397:2;17392:3;17333:67;:::i;:::-;17326:74;;17430:34;17426:1;17421:3;17417:11;17410:55;17496:3;17491:2;17486:3;17482:12;17475:25;17526:2;17521:3;17517:12;17510:19;;17316:219;;;:::o;17541:381::-;;17704:67;17768:2;17763:3;17704:67;:::i;:::-;17697:74;;17801:34;17797:1;17792:3;17788:11;17781:55;17867:19;17862:2;17857:3;17853:12;17846:41;17913:2;17908:3;17904:12;17897:19;;17687:235;;;:::o;17928:376::-;;18091:67;18155:2;18150:3;18091:67;:::i;:::-;18084:74;;18188:34;18184:1;18179:3;18175:11;18168:55;18254:14;18249:2;18244:3;18240:12;18233:36;18295:2;18290:3;18286:12;18279:19;;18074:230;;;:::o;18310:367::-;;18473:67;18537:2;18532:3;18473:67;:::i;:::-;18466:74;;18570:34;18566:1;18561:3;18557:11;18550:55;18636:5;18631:2;18626:3;18622:12;18615:27;18668:2;18663:3;18659:12;18652:19;;18456:221;;;:::o;18683:369::-;;18846:67;18910:2;18905:3;18846:67;:::i;:::-;18839:74;;18943:34;18939:1;18934:3;18930:11;18923:55;19009:7;19004:2;18999:3;18995:12;18988:29;19043:2;19038:3;19034:12;19027:19;;18829:223;;;:::o;19058:369::-;;19221:67;19285:2;19280:3;19221:67;:::i;:::-;19214:74;;19318:34;19314:1;19309:3;19305:11;19298:55;19384:7;19379:2;19374:3;19370:12;19363:29;19418:2;19413:3;19409:12;19402:19;;19204:223;;;:::o;19433:330::-;;19596:67;19660:2;19655:3;19596:67;:::i;:::-;19589:74;;19693:34;19689:1;19684:3;19680:11;19673:55;19754:2;19749:3;19745:12;19738:19;;19579:184;;;:::o;19769:118::-;19856:24;19874:5;19856:24;:::i;:::-;19851:3;19844:37;19834:53;;:::o;19893:435::-;;20095:95;20186:3;20177:6;20095:95;:::i;:::-;20088:102;;20207:95;20298:3;20289:6;20207:95;:::i;:::-;20200:102;;20319:3;20312:10;;20077:251;;;;;:::o;20334:222::-;;20465:2;20454:9;20450:18;20442:26;;20478:71;20546:1;20535:9;20531:17;20522:6;20478:71;:::i;:::-;20432:124;;;;:::o;20562:640::-;;20795:3;20784:9;20780:19;20772:27;;20809:71;20877:1;20866:9;20862:17;20853:6;20809:71;:::i;:::-;20890:72;20958:2;20947:9;20943:18;20934:6;20890:72;:::i;:::-;20972;21040:2;21029:9;21025:18;21016:6;20972:72;:::i;:::-;21091:9;21085:4;21081:20;21076:2;21065:9;21061:18;21054:48;21119:76;21190:4;21181:6;21119:76;:::i;:::-;21111:84;;20762:440;;;;;;;:::o;21208:210::-;;21333:2;21322:9;21318:18;21310:26;;21346:65;21408:1;21397:9;21393:17;21384:6;21346:65;:::i;:::-;21300:118;;;;:::o;21424:313::-;;21575:2;21564:9;21560:18;21552:26;;21624:9;21618:4;21614:20;21610:1;21599:9;21595:17;21588:47;21652:78;21725:4;21716:6;21652:78;:::i;:::-;21644:86;;21542:195;;;;:::o;21743:419::-;;21947:2;21936:9;21932:18;21924:26;;21996:9;21990:4;21986:20;21982:1;21971:9;21967:17;21960:47;22024:131;22150:4;22024:131;:::i;:::-;22016:139;;21914:248;;;:::o;22168:419::-;;22372:2;22361:9;22357:18;22349:26;;22421:9;22415:4;22411:20;22407:1;22396:9;22392:17;22385:47;22449:131;22575:4;22449:131;:::i;:::-;22441:139;;22339:248;;;:::o;22593:419::-;;22797:2;22786:9;22782:18;22774:26;;22846:9;22840:4;22836:20;22832:1;22821:9;22817:17;22810:47;22874:131;23000:4;22874:131;:::i;:::-;22866:139;;22764:248;;;:::o;23018:419::-;;23222:2;23211:9;23207:18;23199:26;;23271:9;23265:4;23261:20;23257:1;23246:9;23242:17;23235:47;23299:131;23425:4;23299:131;:::i;:::-;23291:139;;23189:248;;;:::o;23443:419::-;;23647:2;23636:9;23632:18;23624:26;;23696:9;23690:4;23686:20;23682:1;23671:9;23667:17;23660:47;23724:131;23850:4;23724:131;:::i;:::-;23716:139;;23614:248;;;:::o;23868:419::-;;24072:2;24061:9;24057:18;24049:26;;24121:9;24115:4;24111:20;24107:1;24096:9;24092:17;24085:47;24149:131;24275:4;24149:131;:::i;:::-;24141:139;;24039:248;;;:::o;24293:419::-;;24497:2;24486:9;24482:18;24474:26;;24546:9;24540:4;24536:20;24532:1;24521:9;24517:17;24510:47;24574:131;24700:4;24574:131;:::i;:::-;24566:139;;24464:248;;;:::o;24718:419::-;;24922:2;24911:9;24907:18;24899:26;;24971:9;24965:4;24961:20;24957:1;24946:9;24942:17;24935:47;24999:131;25125:4;24999:131;:::i;:::-;24991:139;;24889:248;;;:::o;25143:419::-;;25347:2;25336:9;25332:18;25324:26;;25396:9;25390:4;25386:20;25382:1;25371:9;25367:17;25360:47;25424:131;25550:4;25424:131;:::i;:::-;25416:139;;25314:248;;;:::o;25568:419::-;;25772:2;25761:9;25757:18;25749:26;;25821:9;25815:4;25811:20;25807:1;25796:9;25792:17;25785:47;25849:131;25975:4;25849:131;:::i;:::-;25841:139;;25739:248;;;:::o;25993:419::-;;26197:2;26186:9;26182:18;26174:26;;26246:9;26240:4;26236:20;26232:1;26221:9;26217:17;26210:47;26274:131;26400:4;26274:131;:::i;:::-;26266:139;;26164:248;;;:::o;26418:419::-;;26622:2;26611:9;26607:18;26599:26;;26671:9;26665:4;26661:20;26657:1;26646:9;26642:17;26635:47;26699:131;26825:4;26699:131;:::i;:::-;26691:139;;26589:248;;;:::o;26843:419::-;;27047:2;27036:9;27032:18;27024:26;;27096:9;27090:4;27086:20;27082:1;27071:9;27067:17;27060:47;27124:131;27250:4;27124:131;:::i;:::-;27116:139;;27014:248;;;:::o;27268:419::-;;27472:2;27461:9;27457:18;27449:26;;27521:9;27515:4;27511:20;27507:1;27496:9;27492:17;27485:47;27549:131;27675:4;27549:131;:::i;:::-;27541:139;;27439:248;;;:::o;27693:419::-;;27897:2;27886:9;27882:18;27874:26;;27946:9;27940:4;27936:20;27932:1;27921:9;27917:17;27910:47;27974:131;28100:4;27974:131;:::i;:::-;27966:139;;27864:248;;;:::o;28118:419::-;;28322:2;28311:9;28307:18;28299:26;;28371:9;28365:4;28361:20;28357:1;28346:9;28342:17;28335:47;28399:131;28525:4;28399:131;:::i;:::-;28391:139;;28289:248;;;:::o;28543:419::-;;28747:2;28736:9;28732:18;28724:26;;28796:9;28790:4;28786:20;28782:1;28771:9;28767:17;28760:47;28824:131;28950:4;28824:131;:::i;:::-;28816:139;;28714:248;;;:::o;28968:419::-;;29172:2;29161:9;29157:18;29149:26;;29221:9;29215:4;29211:20;29207:1;29196:9;29192:17;29185:47;29249:131;29375:4;29249:131;:::i;:::-;29241:139;;29139:248;;;:::o;29393:419::-;;29597:2;29586:9;29582:18;29574:26;;29646:9;29640:4;29636:20;29632:1;29621:9;29617:17;29610:47;29674:131;29800:4;29674:131;:::i;:::-;29666:139;;29564:248;;;:::o;29818:419::-;;30022:2;30011:9;30007:18;29999:26;;30071:9;30065:4;30061:20;30057:1;30046:9;30042:17;30035:47;30099:131;30225:4;30099:131;:::i;:::-;30091:139;;29989:248;;;:::o;30243:419::-;;30447:2;30436:9;30432:18;30424:26;;30496:9;30490:4;30486:20;30482:1;30471:9;30467:17;30460:47;30524:131;30650:4;30524:131;:::i;:::-;30516:139;;30414:248;;;:::o;30668:419::-;;30872:2;30861:9;30857:18;30849:26;;30921:9;30915:4;30911:20;30907:1;30896:9;30892:17;30885:47;30949:131;31075:4;30949:131;:::i;:::-;30941:139;;30839:248;;;:::o;31093:419::-;;31297:2;31286:9;31282:18;31274:26;;31346:9;31340:4;31336:20;31332:1;31321:9;31317:17;31310:47;31374:131;31500:4;31374:131;:::i;:::-;31366:139;;31264:248;;;:::o;31518:419::-;;31722:2;31711:9;31707:18;31699:26;;31771:9;31765:4;31761:20;31757:1;31746:9;31742:17;31735:47;31799:131;31925:4;31799:131;:::i;:::-;31791:139;;31689:248;;;:::o;31943:419::-;;32147:2;32136:9;32132:18;32124:26;;32196:9;32190:4;32186:20;32182:1;32171:9;32167:17;32160:47;32224:131;32350:4;32224:131;:::i;:::-;32216:139;;32114:248;;;:::o;32368:419::-;;32572:2;32561:9;32557:18;32549:26;;32621:9;32615:4;32611:20;32607:1;32596:9;32592:17;32585:47;32649:131;32775:4;32649:131;:::i;:::-;32641:139;;32539:248;;;:::o;32793:419::-;;32997:2;32986:9;32982:18;32974:26;;33046:9;33040:4;33036:20;33032:1;33021:9;33017:17;33010:47;33074:131;33200:4;33074:131;:::i;:::-;33066:139;;32964:248;;;:::o;33218:419::-;;33422:2;33411:9;33407:18;33399:26;;33471:9;33465:4;33461:20;33457:1;33446:9;33442:17;33435:47;33499:131;33625:4;33499:131;:::i;:::-;33491:139;;33389:248;;;:::o;33643:419::-;;33847:2;33836:9;33832:18;33824:26;;33896:9;33890:4;33886:20;33882:1;33871:9;33867:17;33860:47;33924:131;34050:4;33924:131;:::i;:::-;33916:139;;33814:248;;;:::o;34068:419::-;;34272:2;34261:9;34257:18;34249:26;;34321:9;34315:4;34311:20;34307:1;34296:9;34292:17;34285:47;34349:131;34475:4;34349:131;:::i;:::-;34341:139;;34239:248;;;:::o;34493:419::-;;34697:2;34686:9;34682:18;34674:26;;34746:9;34740:4;34736:20;34732:1;34721:9;34717:17;34710:47;34774:131;34900:4;34774:131;:::i;:::-;34766:139;;34664:248;;;:::o;34918:222::-;;35049:2;35038:9;35034:18;35026:26;;35062:71;35130:1;35119:9;35115:17;35106:6;35062:71;:::i;:::-;35016:124;;;;:::o;35146:283::-;;35212:2;35206:9;35196:19;;35254:4;35246:6;35242:17;35361:6;35349:10;35346:22;35325:18;35313:10;35310:34;35307:62;35304:2;;;35372:18;;:::i;:::-;35304:2;35412:10;35408:2;35401:22;35186:243;;;;:::o;35435:331::-;;35586:18;35578:6;35575:30;35572:2;;;35608:18;;:::i;:::-;35572:2;35693:4;35689:9;35682:4;35674:6;35670:17;35666:33;35658:41;;35754:4;35748;35744:15;35736:23;;35501:265;;;:::o;35772:332::-;;35924:18;35916:6;35913:30;35910:2;;;35946:18;;:::i;:::-;35910:2;36031:4;36027:9;36020:4;36012:6;36008:17;36004:33;35996:41;;36092:4;36086;36082:15;36074:23;;35839:265;;;:::o;36110:98::-;;36195:5;36189:12;36179:22;;36168:40;;;:::o;36214:99::-;;36300:5;36294:12;36284:22;;36273:40;;;:::o;36319:168::-;;36436:6;36431:3;36424:19;36476:4;36471:3;36467:14;36452:29;;36414:73;;;;:::o;36493:169::-;;36611:6;36606:3;36599:19;36651:4;36646:3;36642:14;36627:29;;36589:73;;;;:::o;36668:148::-;;36807:3;36792:18;;36782:34;;;;:::o;36822:305::-;;36881:20;36899:1;36881:20;:::i;:::-;36876:25;;36915:20;36933:1;36915:20;:::i;:::-;36910:25;;37069:1;37001:66;36997:74;36994:1;36991:81;36988:2;;;37075:18;;:::i;:::-;36988:2;37119:1;37116;37112:9;37105:16;;36866:261;;;;:::o;37133:185::-;;37190:20;37208:1;37190:20;:::i;:::-;37185:25;;37224:20;37242:1;37224:20;:::i;:::-;37219:25;;37263:1;37253:2;;37268:18;;:::i;:::-;37253:2;37310:1;37307;37303:9;37298:14;;37175:143;;;;:::o;37324:348::-;;37387:20;37405:1;37387:20;:::i;:::-;37382:25;;37421:20;37439:1;37421:20;:::i;:::-;37416:25;;37609:1;37541:66;37537:74;37534:1;37531:81;37526:1;37519:9;37512:17;37508:105;37505:2;;;37616:18;;:::i;:::-;37505:2;37664:1;37661;37657:9;37646:20;;37372:300;;;;:::o;37678:191::-;;37738:20;37756:1;37738:20;:::i;:::-;37733:25;;37772:20;37790:1;37772:20;:::i;:::-;37767:25;;37811:1;37808;37805:8;37802:2;;;37816:18;;:::i;:::-;37802:2;37861:1;37858;37854:9;37846:17;;37723:146;;;;:::o;37875:96::-;;37941:24;37959:5;37941:24;:::i;:::-;37930:35;;37920:51;;;:::o;37977:90::-;;38054:5;38047:13;38040:21;38029:32;;38019:48;;;:::o;38073:149::-;;38149:66;38142:5;38138:78;38127:89;;38117:105;;;:::o;38228:126::-;;38305:42;38298:5;38294:54;38283:65;;38273:81;;;:::o;38360:77::-;;38426:5;38415:16;;38405:32;;;:::o;38443:154::-;38527:6;38522:3;38517;38504:30;38589:1;38580:6;38575:3;38571:16;38564:27;38494:103;;;:::o;38603:307::-;38671:1;38681:113;38695:6;38692:1;38689:13;38681:113;;;38780:1;38775:3;38771:11;38765:18;38761:1;38756:3;38752:11;38745:39;38717:2;38714:1;38710:10;38705:15;;38681:113;;;38812:6;38809:1;38806:13;38803:2;;;38892:1;38883:6;38878:3;38874:16;38867:27;38803:2;38652:258;;;;:::o;38916:320::-;;38997:1;38991:4;38987:12;38977:22;;39044:1;39038:4;39034:12;39065:18;39055:2;;39121:4;39113:6;39109:17;39099:27;;39055:2;39183;39175:6;39172:14;39152:18;39149:38;39146:2;;;39202:18;;:::i;:::-;39146:2;38967:269;;;;:::o;39242:233::-;;39304:24;39322:5;39304:24;:::i;:::-;39295:33;;39350:66;39343:5;39340:77;39337:2;;;39420:18;;:::i;:::-;39337:2;39467:1;39460:5;39456:13;39449:20;;39285:190;;;:::o;39481:176::-;;39530:20;39548:1;39530:20;:::i;:::-;39525:25;;39564:20;39582:1;39564:20;:::i;:::-;39559:25;;39603:1;39593:2;;39608:18;;:::i;:::-;39593:2;39649:1;39646;39642:9;39637:14;;39515:142;;;;:::o;39663:180::-;39711:77;39708:1;39701:88;39808:4;39805:1;39798:15;39832:4;39829:1;39822:15;39849:180;39897:77;39894:1;39887:88;39994:4;39991:1;39984:15;40018:4;40015:1;40008:15;40035:180;40083:77;40080:1;40073:88;40180:4;40177:1;40170:15;40204:4;40201:1;40194:15;40221:180;40269:77;40266:1;40259:88;40366:4;40363:1;40356:15;40390:4;40387:1;40380:15;40407:102;;40499:2;40495:7;40490:2;40483:5;40479:14;40475:28;40465:38;;40455:54;;;:::o;40515:122::-;40588:24;40606:5;40588:24;:::i;:::-;40581:5;40578:35;40568:2;;40627:1;40624;40617:12;40568:2;40558:79;:::o;40643:116::-;40713:21;40728:5;40713:21;:::i;:::-;40706:5;40703:32;40693:2;;40749:1;40746;40739:12;40693:2;40683:76;:::o;40765:120::-;40837:23;40854:5;40837:23;:::i;:::-;40830:5;40827:34;40817:2;;40875:1;40872;40865:12;40817:2;40807:78;:::o;40891:122::-;40964:24;40982:5;40964:24;:::i;:::-;40957:5;40954:35;40944:2;;41003:1;41000;40993:12;40944:2;40934:79;:::o
Swarm Source
ipfs://84591db8de77eccbbf29e81f63ddf9672c8d94d4bf0611eaba7cafbe74123774
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.