Overview
TokenID
15900
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
HuxleyComics
Compiler Version
v0.8.6+commit.11564f7e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-10-13 */ // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: contracts/interfaces/IHuxleyComics.sol pragma solidity 0.8.6; interface IHuxleyComics is IERC721 { struct Issue { uint256 price; uint256 goldSupplyLeft; uint256 firstEditionSupplyLeft; uint256 holographicSupplyLeft; uint256 serialNumberToMintGold; uint256 serialNumberToMintFirstEdition; uint256 serialNumberToMintHolographic; uint256 maxPayableMintBatch; string uri; bool exist; } struct Token { uint256 serialNumber; uint256 issueNumber; TokenType tokenType; } enum TokenType {FirstEdition, Gold, Holographic} function safeMint(address _to) external returns (uint256); function getCurrentIssue() external returns (uint256 _currentIssue); function getCurrentPrice() external returns (uint256 _currentPrice); function getCurrentMaxPayableMintBatch() external returns (uint256 _currentMaxPayableMintBatch); function createNewIssue( uint256 _price, uint256 _goldSupply, uint256 _firstEditionSupply, uint256 _holographicSupply, uint256 _startSerialNumberGold, uint256 _startSerialNumberFirstEdition, uint256 _startSerialNumberHolographic, uint256 _maxPaybleMintBatch, string memory _uri ) external; function getIssue(uint256 _issueNumber) external returns (Issue memory _issue); function getToken(uint256 _tokenId) external returns (Token memory _token); function setTokenDetails(uint256 _tokenId, TokenType _tokenType) external; function setBaseURI(uint256 _issueNumber, string memory _uri) external; function setCanBurn(bool _canBurn) external; } // File: @openzeppelin/contracts/utils/Context.sol pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: contracts/HuxleyComics.sol pragma solidity 0.8.6; contract HuxleyComics is ERC721Enumerable, IHuxleyComics, ReentrancyGuard, Ownable { using Strings for uint256; // address of the HuxleyComicsOps contract that can mint tokens address public minter; // control if tokens can be burned or not. Default is false bool public canBurn; // Last token id minted uint256 public tokenId; //Issue being minted uint256 private currentIssue; //Price of token to be minted uint256 private currentPrice; //Max amount of tokens that can be mined from current issue uint256 private currentMaxPayableMintBatch; // mapping of Issues - issue number -> Isssue mapping(uint256 => Issue) private issues; // mapping of redemptions - tokenId -> true/false mapping(uint256 => bool) public redemptions; // mapping of Tokens - tokenId -> Token mapping(uint256 => Token) private tokens; /** * @dev Modifier that checks that address is minter. Reverts * if sender is not the minter */ modifier onlyMinter() { require(msg.sender == minter, "HT: Only minter"); _; } /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token. */ constructor() ERC721("HUXLEY Comics", "HUXLEY") {} /** * @dev Safely mints a token. Increments 'tokenId' by 1 and calls super._safeMint() * * @param to Address that will be the owner of the token */ function safeMint(address to) external override onlyMinter() nonReentrant returns (uint256 _tokenId) { tokenId++; super._safeMint(to, tokenId); return tokenId; } /** * @dev Burns a token. Can only be called by token Owner * * @param _tokenId Token that will be burned */ function burn(uint256 _tokenId) external { require(canBurn, "HT: is not burnable"); require(ownerOf(_tokenId) == msg.sender, "HT: Not owner"); super._burn(_tokenId); } /** * @dev It creates a new Issue. Only 'minter' can call this function. * * @param _price Price for each token to be minted in wei * @param _goldSupply Total supply of Gold token * @param _firstEditionSupply Total supply of First Edition token * @param _holographicSupply Total supply of Holographic token * @param _startSerialNumberGold Initial serial number for Gold token * @param _startSerialNumberFirstEdition Initial serial number for First Edition token * @param _startSerialNumberHolographic Initial serial number for Holographic token * @param _maxPayableMintBatch Max amount of tokens that can be minted when calling batch functions (should not be greater than 100 so it won't run out of gas) * @param _uri Uri for the tokens of the issue */ function createNewIssue( uint256 _price, uint256 _goldSupply, uint256 _firstEditionSupply, uint256 _holographicSupply, uint256 _startSerialNumberGold, uint256 _startSerialNumberFirstEdition, uint256 _startSerialNumberHolographic, uint256 _maxPayableMintBatch, string memory _uri ) external override onlyMinter { currentIssue = currentIssue + 1; currentPrice = _price; currentMaxPayableMintBatch = _maxPayableMintBatch; Issue storage issue = issues[currentIssue]; issue.price = _price; issue.goldSupplyLeft = _goldSupply; issue.firstEditionSupplyLeft = _firstEditionSupply; issue.holographicSupplyLeft = _holographicSupply; issue.serialNumberToMintGold = _startSerialNumberGold; issue.serialNumberToMintFirstEdition = _startSerialNumberFirstEdition; issue.serialNumberToMintHolographic = _startSerialNumberHolographic; issue.maxPayableMintBatch = _maxPayableMintBatch; issue.uri = _uri; issue.exist = true; } /** * @dev Returns whether `issueNumber` exists. * * Issue can be created via {createNewIssue}. * */ function _issueExists(uint256 _issueNumber) internal view virtual returns (bool) { return issues[_issueNumber].exist ? true : false; } /** * @dev It sets details for the token. It sets the issue number, serial number and token type. * It also updates supply left of the token. * * Emits a {IssueCreated} event. * * @param _tokenId tokenID * @param _tokenType tokenType */ function setTokenDetails(uint256 _tokenId, TokenType _tokenType) external override onlyMinter { Token storage token = tokens[_tokenId]; token.issueNumber = currentIssue; Issue storage issue = issues[currentIssue]; // can mint Gold, FirstEdition and Holographic if (_tokenType == TokenType.Gold) { uint256 goldSupplyLeft = issue.goldSupplyLeft; require(goldSupplyLeft > 0, "HT: no gold"); issue.goldSupplyLeft = goldSupplyLeft - 1; uint256 serialNumberGold = issue.serialNumberToMintGold; issue.serialNumberToMintGold = serialNumberGold + 1; //next mint token.tokenType = TokenType.Gold; token.serialNumber = serialNumberGold; } else if (_tokenType == TokenType.FirstEdition) { uint256 firstEditionSupplyLeft = issue.firstEditionSupplyLeft; require(firstEditionSupplyLeft > 0, "HT: no firstEdition"); issue.firstEditionSupplyLeft = firstEditionSupplyLeft - 1; uint256 serialNumberFirstEdition = issue.serialNumberToMintFirstEdition; issue.serialNumberToMintFirstEdition = serialNumberFirstEdition + 1; //next mint token.tokenType = TokenType.FirstEdition; token.serialNumber = serialNumberFirstEdition; } else if (_tokenType == TokenType.Holographic) { uint256 holographicSupplyLeft = issue.holographicSupplyLeft; require(holographicSupplyLeft > 0, "HT: no holographic"); issue.holographicSupplyLeft = holographicSupplyLeft - 1; uint256 serialNumberHolographic = issue.serialNumberToMintHolographic; issue.serialNumberToMintHolographic = serialNumberHolographic + 1; //next mint token.tokenType = TokenType.Holographic; token.serialNumber = serialNumberHolographic; } else { revert(); } } /// @dev Returns URI for the token. Each Issue number has a base uri. function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require(_exists(_tokenId), "UT: invalid token"); Token memory token = tokens[_tokenId]; uint256 issueNumber = token.issueNumber; require(issueNumber > 0, "HT: invalid issue"); Issue memory issue = issues[issueNumber]; string memory baseURI = issue.uri; return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, _tokenId.toString())) : ""; } /** * @dev Sets URI for an Issue. * * Issue can be created via {createNewIssue} by the Minter. * */ function setBaseURI(uint256 _issueNumber, string memory _uri) external override onlyMinter { require(_issueExists(_issueNumber), "UT: invalid issue"); Issue storage issue = issues[_issueNumber]; issue.uri = _uri; } /// @dev Returns Issue that can be minted. function getCurrentIssue() external view override returns (uint256 _currentIssue) { return currentIssue; } /// @dev Returns Price of token that can be minted. function getCurrentPrice() external view override returns (uint256 _currentPrice) { return currentPrice; } /// @dev Returns Max Amount of First Edition tokens an address can pay to mint. function getCurrentMaxPayableMintBatch() external view override returns (uint256 _currentMaxaPaybleMintBatch) { return currentMaxPayableMintBatch; } /** * @dev Returns details of an Issue: 'price', 'goldSupplyLeft', 'firstEditionSupplyLeft, * 'holographicSupplyLeft', 'serialNumberToMintGold', 'serialNumberToMintFirstEdition', * 'serialNumberToMintHolographic', 'MaxPayableMintBatch', 'uri' and 'exist'. * */ function getIssue(uint256 _issueNumber) external view override returns (Issue memory _issue) { return issues[_issueNumber]; } /// @dev Returns token details: 'serialNumber', 'issueNumber' and 'TokenType' function getToken(uint256 _tokenId) external view override returns (Token memory _token) { return tokens[_tokenId]; } /// @dev User can redeem a copy function redeemCopy(uint256 _tokenId) external { require(ownerOf(_tokenId) == msg.sender, "HT: Not owner"); require(redemptions[_tokenId] == false, "HT: already redeemed"); redemptions[_tokenId] = true; } // Setup functions /// @dev Sets new minter address. Only Owner can call this function. function updateMinter(address _minter) external onlyOwner { minter = _minter; } /// @dev Sets if it is allowed to burn tokens. Default is 'false'. Only Minter can call this function. function setCanBurn(bool _canBurn) external override onlyMinter { canBurn = _canBurn; } // End setup functions }
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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"canBurn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_goldSupply","type":"uint256"},{"internalType":"uint256","name":"_firstEditionSupply","type":"uint256"},{"internalType":"uint256","name":"_holographicSupply","type":"uint256"},{"internalType":"uint256","name":"_startSerialNumberGold","type":"uint256"},{"internalType":"uint256","name":"_startSerialNumberFirstEdition","type":"uint256"},{"internalType":"uint256","name":"_startSerialNumberHolographic","type":"uint256"},{"internalType":"uint256","name":"_maxPayableMintBatch","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"}],"name":"createNewIssue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentIssue","outputs":[{"internalType":"uint256","name":"_currentIssue","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentMaxPayableMintBatch","outputs":[{"internalType":"uint256","name":"_currentMaxaPaybleMintBatch","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentPrice","outputs":[{"internalType":"uint256","name":"_currentPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_issueNumber","type":"uint256"}],"name":"getIssue","outputs":[{"components":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"goldSupplyLeft","type":"uint256"},{"internalType":"uint256","name":"firstEditionSupplyLeft","type":"uint256"},{"internalType":"uint256","name":"holographicSupplyLeft","type":"uint256"},{"internalType":"uint256","name":"serialNumberToMintGold","type":"uint256"},{"internalType":"uint256","name":"serialNumberToMintFirstEdition","type":"uint256"},{"internalType":"uint256","name":"serialNumberToMintHolographic","type":"uint256"},{"internalType":"uint256","name":"maxPayableMintBatch","type":"uint256"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"bool","name":"exist","type":"bool"}],"internalType":"struct IHuxleyComics.Issue","name":"_issue","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getToken","outputs":[{"components":[{"internalType":"uint256","name":"serialNumber","type":"uint256"},{"internalType":"uint256","name":"issueNumber","type":"uint256"},{"internalType":"enum IHuxleyComics.TokenType","name":"tokenType","type":"uint8"}],"internalType":"struct IHuxleyComics.Token","name":"_token","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"redeemCopy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redemptions","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"safeMint","outputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_issueNumber","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_canBurn","type":"bool"}],"name":"setCanBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"enum IHuxleyComics.TokenType","name":"_tokenType","type":"uint8"}],"name":"setTokenDetails","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"updateMinter","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280600d81526020017f4855584c455920436f6d696373000000000000000000000000000000000000008152506040518060400160405280600681526020017f4855584c45590000000000000000000000000000000000000000000000000000815250816000908051906020019062000096929190620001ae565b508060019080519060200190620000af929190620001ae565b5050506001600a81905550620000da620000ce620000e060201b60201c565b620000e860201b60201c565b620002c3565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001bc906200025e565b90600052602060002090601f016020900481019282620001e057600085556200022c565b82601f10620001fb57805160ff19168380011785556200022c565b828001600101855582156200022c579182015b828111156200022b5782518255916020019190600101906200020e565b5b5090506200023b91906200023f565b5090565b5b808211156200025a57600081600090555060010162000240565b5090565b600060028204905060018216806200027757607f821691505b602082108114156200028e576200028d62000294565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614f2080620002d36000396000f3fe608060405234801561001057600080fd5b506004361061021c5760003560e01c806370a0823111610125578063beb65893116100ad578063c8ae3bc81161007c578063c8ae3bc81461064d578063e4b50cb814610669578063e985e9c514610699578063eb91d37e146106c9578063f2fde38b146106e75761021c565b8063beb65893146105b3578063c063e5be146105e3578063c1eb1840146105ff578063c87b56dd1461061d5761021c565b806395d89b41116100f457806395d89b411461050f578063976b31131461052d5780639cd0c2db1461055d578063a22cb4651461057b578063b88d4fde146105975761021c565b806370a0823114610499578063715018a6146104c9578063858e86ea146104d35780638da5cb5b146104f15761021c565b806333cfcb9f116101a857806342966c681161017757806342966c68146103e55780634eb03f6e146104015780634f6ccce71461041d578063573ee57a1461044d5780636352211e146104695761021c565b806333cfcb9f14610361578063386c69f21461037d57806340d097c31461039957806342842e0e146103c95761021c565b8063095ea7b3116101ef578063095ea7b3146102bd57806317d70f7c146102d957806318160ddd146102f757806323b872dd146103155780632f745c59146103315761021c565b806301ffc9a71461022157806306fdde0314610251578063075461721461026f578063081812fc1461028d575b600080fd5b61023b60048036038101906102369190613675565b610703565b6040516102489190613f2f565b60405180910390f35b61025961077d565b6040516102669190613f4a565b60405180910390f35b61027761080f565b6040516102849190613ec8565b60405180910390f35b6102a760048036038101906102a291906136cf565b610835565b6040516102b49190613ec8565b60405180910390f35b6102d760048036038101906102d29190613608565b6108ba565b005b6102e16109d2565b6040516102ee9190614329565b60405180910390f35b6102ff6109d8565b60405161030c9190614329565b60405180910390f35b61032f600480360381019061032a91906134f2565b6109e5565b005b61034b60048036038101906103469190613608565b610a45565b6040516103589190614329565b60405180910390f35b61037b6004803603810190610376919061373c565b610aea565b005b61039760048036038101906103929190613648565b610bf7565b005b6103b360048036038101906103ae9190613485565b610ca4565b6040516103c09190614329565b60405180910390f35b6103e360048036038101906103de91906134f2565b610dba565b005b6103ff60048036038101906103fa91906136cf565b610dda565b005b61041b60048036038101906104169190613485565b610eab565b005b610437600480360381019061043291906136cf565b610f6b565b6040516104449190614329565b60405180910390f35b610467600480360381019061046291906136fc565b610fdc565b005b610483600480360381019061047e91906136cf565b61136e565b6040516104909190613ec8565b60405180910390f35b6104b360048036038101906104ae9190613485565b611420565b6040516104c09190614329565b60405180910390f35b6104d16114d8565b005b6104db611560565b6040516104e89190614329565b60405180910390f35b6104f961156a565b6040516105069190613ec8565b60405180910390f35b610517611594565b6040516105249190613f4a565b60405180910390f35b610547600480360381019061054291906136cf565b611626565b60405161055491906142ec565b60405180910390f35b610565611751565b6040516105729190614329565b60405180910390f35b610595600480360381019061059091906135c8565b61175b565b005b6105b160048036038101906105ac9190613545565b6118dc565b005b6105cd60048036038101906105c891906136cf565b61193e565b6040516105da9190613f2f565b60405180910390f35b6105fd60048036038101906105f891906136cf565b61195e565b005b610607611a6a565b6040516106149190613f2f565b60405180910390f35b610637600480360381019061063291906136cf565b611a7d565b6040516106449190613f4a565b60405180910390f35b61066760048036038101906106629190613798565b611d02565b005b610683600480360381019061067e91906136cf565b611e58565b604051610690919061430e565b60405180910390f35b6106b360048036038101906106ae91906134b2565b611ed4565b6040516106c09190613f2f565b60405180910390f35b6106d1611f68565b6040516106de9190614329565b60405180910390f35b61070160048036038101906106fc9190613485565b611f72565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061077657506107758261206a565b5b9050919050565b60606000805461078c906145b5565b80601f01602080910402602001604051908101604052809291908181526020018280546107b8906145b5565b80156108055780601f106107da57610100808354040283529160200191610805565b820191906000526020600020905b8154815290600101906020018083116107e857829003601f168201915b5050505050905090565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006108408261214c565b61087f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108769061414c565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108c58261136e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610936576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092d906141ec565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109556121b8565b73ffffffffffffffffffffffffffffffffffffffff16148061098457506109838161097e6121b8565b611ed4565b5b6109c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ba9061408c565b60405180910390fd5b6109cd83836121c0565b505050565b600d5481565b6000600880549050905090565b6109f66109f06121b8565b82612279565b610a35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2c9061422c565b60405180910390fd5b610a40838383612357565b505050565b6000610a5083611420565b8210610a91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8890613f8c565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b71906142cc565b60405180910390fd5b610b83826125b3565b610bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb99061412c565b60405180910390fd5b600060116000848152602001908152602001600020905081816008019080519060200190610bf19291906131fc565b50505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7e906142cc565b60405180910390fd5b80600c60146101000a81548160ff02191690831515021790555050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d906142cc565b60405180910390fd5b6002600a541415610d7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d73906142ac565b60405180910390fd5b6002600a81905550600d6000815480929190610d9790614618565b9190505550610da882600d546125ee565b600d5490506001600a81905550919050565b610dd5838383604051806020016040528060008152506118dc565b505050565b600c60149054906101000a900460ff16610e29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e209061428c565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16610e498261136e565b73ffffffffffffffffffffffffffffffffffffffff1614610e9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e96906140ac565b60405180910390fd5b610ea88161260c565b50565b610eb36121b8565b73ffffffffffffffffffffffffffffffffffffffff16610ed161156a565b73ffffffffffffffffffffffffffffffffffffffff1614610f27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1e906141ac565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610f756109d8565b8210610fb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fad9061424c565b60405180910390fd5b60088281548110610fca57610fc961477d565b5b90600052602060002001549050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461106c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611063906142cc565b60405180910390fd5b6000601360008481526020019081526020016000209050600e548160010181905550600060116000600e5481526020019081526020016000209050600160028111156110bb576110ba6146f0565b5b8360028111156110ce576110cd6146f0565b5b14156111905760008160010154905060008111611120576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111179061416c565b60405180910390fd5b60018161112d91906144a6565b826001018190555060008260040154905060018161114b919061441f565b836004018190555060018460020160006101000a81548160ff0219169083600281111561117b5761117a6146f0565b5b02179055508084600001819055505050611368565b600060028111156111a4576111a36146f0565b5b8360028111156111b7576111b66146f0565b5b14156112795760008160020154905060008111611209576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120090613f6c565b60405180910390fd5b60018161121691906144a6565b8260020181905550600082600501549050600181611234919061441f565b836005018190555060008460020160006101000a81548160ff02191690836002811115611264576112636146f0565b5b02179055508084600001819055505050611367565b60028081111561128c5761128b6146f0565b5b83600281111561129f5761129e6146f0565b5b141561136157600081600301549050600081116112f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e89061418c565b60405180910390fd5b6001816112fe91906144a6565b826003018190555060008260060154905060018161131c919061441f565b836006018190555060028460020160006101000a81548160ff0219169083600281111561134c5761134b6146f0565b5b02179055508084600001819055505050611366565b600080fd5b5b5b50505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140e906140ec565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611491576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611488906140cc565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6114e06121b8565b73ffffffffffffffffffffffffffffffffffffffff166114fe61156a565b73ffffffffffffffffffffffffffffffffffffffff1614611554576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154b906141ac565b60405180910390fd5b61155e600061271d565b565b6000601054905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546115a3906145b5565b80601f01602080910402602001604051908101604052809291908181526020018280546115cf906145b5565b801561161c5780601f106115f15761010080835404028352916020019161161c565b820191906000526020600020905b8154815290600101906020018083116115ff57829003601f168201915b5050505050905090565b61162e613282565b601160008381526020019081526020016000206040518061014001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820180546116ad906145b5565b80601f01602080910402602001604051908101604052809291908181526020018280546116d9906145b5565b80156117265780601f106116fb57610100808354040283529160200191611726565b820191906000526020600020905b81548152906001019060200180831161170957829003601f168201915b505050505081526020016009820160009054906101000a900460ff1615151515815250509050919050565b6000600e54905090565b6117636121b8565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c89061404c565b60405180910390fd5b80600560006117de6121b8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661188b6121b8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118d09190613f2f565b60405180910390a35050565b6118ed6118e76121b8565b83612279565b61192c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119239061422c565b60405180910390fd5b611938848484846127e3565b50505050565b60126020528060005260406000206000915054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff1661197e8261136e565b73ffffffffffffffffffffffffffffffffffffffff16146119d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cb906140ac565b60405180910390fd5b600015156012600083815260200190815260200160002060009054906101000a900460ff16151514611a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a329061420c565b60405180910390fd5b60016012600083815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600c60149054906101000a900460ff1681565b6060611a888261214c565b611ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abe9061426c565b60405180910390fd5b60006013600084815260200190815260200160002060405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900460ff166002811115611b2057611b1f6146f0565b5b6002811115611b3257611b316146f0565b5b81525050905060008160200151905060008111611b84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7b90613fec565b60405180910390fd5b600060116000838152602001908152602001600020604051806101400160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882018054611c05906145b5565b80601f0160208091040260200160405190810160405280929190818152602001828054611c31906145b5565b8015611c7e5780601f10611c5357610100808354040283529160200191611c7e565b820191906000526020600020905b815481529060010190602001808311611c6157829003601f168201915b505050505081526020016009820160009054906101000a900460ff1615151515815250509050600081610100015190506000815111611ccc5760405180602001604052806000815250611cf7565b80611cd68761283f565b604051602001611ce7929190613ea4565b6040516020818303038152906040525b945050505050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d89906142cc565b60405180910390fd5b6001600e54611da1919061441f565b600e8190555088600f8190555081601081905550600060116000600e548152602001908152602001600020905089816000018190555088816001018190555087816002018190555086816003018190555085816004018190555084816005018190555083816006018190555082816007018190555081816008019080519060200190611e2e9291906131fc565b5060018160090160006101000a81548160ff02191690831515021790555050505050505050505050565b611e606132d7565b6013600083815260200190815260200160002060405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900460ff166002811115611eb757611eb66146f0565b5b6002811115611ec957611ec86146f0565b5b815250509050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600f54905090565b611f7a6121b8565b73ffffffffffffffffffffffffffffffffffffffff16611f9861156a565b73ffffffffffffffffffffffffffffffffffffffff1614611fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe5906141ac565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561205e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205590613fcc565b60405180910390fd5b6120678161271d565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061213557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806121455750612144826129a0565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166122338361136e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006122848261214c565b6122c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ba9061406c565b60405180910390fd5b60006122ce8361136e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061233d57508373ffffffffffffffffffffffffffffffffffffffff1661232584610835565b73ffffffffffffffffffffffffffffffffffffffff16145b8061234e575061234d8185611ed4565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166123778261136e565b73ffffffffffffffffffffffffffffffffffffffff16146123cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c4906141cc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561243d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124349061402c565b60405180910390fd5b612448838383612a0a565b6124536000826121c0565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124a391906144a6565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124fa919061441f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006011600083815260200190815260200160002060090160009054906101000a900460ff166125e45760006125e7565b60015b9050919050565b612608828260405180602001604052806000815250612b1e565b5050565b60006126178261136e565b905061262581600084612a0a565b6126306000836121c0565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461268091906144a6565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6127ee848484612357565b6127fa84848484612b79565b612839576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283090613fac565b60405180910390fd5b50505050565b60606000821415612887576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061299b565b600082905060005b600082146128b95780806128a290614618565b915050600a826128b29190614475565b915061288f565b60008167ffffffffffffffff8111156128d5576128d46147ac565b5b6040519080825280601f01601f1916602001820160405280156129075781602001600182028036833780820191505090505b5090505b600085146129945760018261292091906144a6565b9150600a8561292f9190614661565b603061293b919061441f565b60f81b8183815181106129515761295061477d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561298d9190614475565b945061290b565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612a15838383612d10565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a5857612a5381612d15565b612a97565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612a9657612a958382612d5e565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ada57612ad581612ecb565b612b19565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612b1857612b178282612f9c565b5b5b505050565b612b28838361301b565b612b356000848484612b79565b612b74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6b90613fac565b60405180910390fd5b505050565b6000612b9a8473ffffffffffffffffffffffffffffffffffffffff166131e9565b15612d03578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612bc36121b8565b8786866040518563ffffffff1660e01b8152600401612be59493929190613ee3565b602060405180830381600087803b158015612bff57600080fd5b505af1925050508015612c3057506040513d601f19601f82011682018060405250810190612c2d91906136a2565b60015b612cb3573d8060008114612c60576040519150601f19603f3d011682016040523d82523d6000602084013e612c65565b606091505b50600081511415612cab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca290613fac565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d08565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612d6b84611420565b612d7591906144a6565b9050600060076000848152602001908152602001600020549050818114612e5a576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612edf91906144a6565b9050600060096000848152602001908152602001600020549050600060088381548110612f0f57612f0e61477d565b5b906000526020600020015490508060088381548110612f3157612f3061477d565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612f8057612f7f61474e565b5b6001900381819060005260206000200160009055905550505050565b6000612fa783611420565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561308b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130829061410c565b60405180910390fd5b6130948161214c565b156130d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130cb9061400c565b60405180910390fd5b6130e060008383612a0a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613130919061441f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054613208906145b5565b90600052602060002090601f01602090048101928261322a5760008555613271565b82601f1061324357805160ff1916838001178555613271565b82800160010185558215613271579182015b82811115613270578251825591602001919060010190613255565b5b50905061327e919061330a565b5090565b6040518061014001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001606081526020016000151581525090565b6040518060600160405280600081526020016000815260200160006002811115613304576133036146f0565b5b81525090565b5b8082111561332357600081600090555060010161330b565b5090565b600061333a61333584614369565b614344565b905082815260208101848484011115613356576133556147e0565b5b613361848285614573565b509392505050565b600061337c6133778461439a565b614344565b905082815260208101848484011115613398576133976147e0565b5b6133a3848285614573565b509392505050565b6000813590506133ba81614e7e565b92915050565b6000813590506133cf81614e95565b92915050565b6000813590506133e481614eac565b92915050565b6000815190506133f981614eac565b92915050565b600082601f830112613414576134136147db565b5b8135613424848260208601613327565b91505092915050565b60008135905061343c81614ec3565b92915050565b600082601f830112613457576134566147db565b5b8135613467848260208601613369565b91505092915050565b60008135905061347f81614ed3565b92915050565b60006020828403121561349b5761349a6147ea565b5b60006134a9848285016133ab565b91505092915050565b600080604083850312156134c9576134c86147ea565b5b60006134d7858286016133ab565b92505060206134e8858286016133ab565b9150509250929050565b60008060006060848603121561350b5761350a6147ea565b5b6000613519868287016133ab565b935050602061352a868287016133ab565b925050604061353b86828701613470565b9150509250925092565b6000806000806080858703121561355f5761355e6147ea565b5b600061356d878288016133ab565b945050602061357e878288016133ab565b935050604061358f87828801613470565b925050606085013567ffffffffffffffff8111156135b0576135af6147e5565b5b6135bc878288016133ff565b91505092959194509250565b600080604083850312156135df576135de6147ea565b5b60006135ed858286016133ab565b92505060206135fe858286016133c0565b9150509250929050565b6000806040838503121561361f5761361e6147ea565b5b600061362d858286016133ab565b925050602061363e85828601613470565b9150509250929050565b60006020828403121561365e5761365d6147ea565b5b600061366c848285016133c0565b91505092915050565b60006020828403121561368b5761368a6147ea565b5b6000613699848285016133d5565b91505092915050565b6000602082840312156136b8576136b76147ea565b5b60006136c6848285016133ea565b91505092915050565b6000602082840312156136e5576136e46147ea565b5b60006136f384828501613470565b91505092915050565b60008060408385031215613713576137126147ea565b5b600061372185828601613470565b92505060206137328582860161342d565b9150509250929050565b60008060408385031215613753576137526147ea565b5b600061376185828601613470565b925050602083013567ffffffffffffffff811115613782576137816147e5565b5b61378e85828601613442565b9150509250929050565b60008060008060008060008060006101208a8c0312156137bb576137ba6147ea565b5b60006137c98c828d01613470565b99505060206137da8c828d01613470565b98505060406137eb8c828d01613470565b97505060606137fc8c828d01613470565b965050608061380d8c828d01613470565b95505060a061381e8c828d01613470565b94505060c061382f8c828d01613470565b93505060e06138408c828d01613470565b9250506101008a013567ffffffffffffffff811115613862576138616147e5565b5b61386e8c828d01613442565b9150509295985092959850929598565b613887816144da565b82525050565b613896816144ec565b82525050565b6138a5816144ec565b82525050565b60006138b6826143cb565b6138c081856143e1565b93506138d0818560208601614582565b6138d9816147ef565b840191505092915050565b6138ed81614561565b82525050565b60006138fe826143d6565b61390881856143f2565b9350613918818560208601614582565b613921816147ef565b840191505092915050565b6000613937826143d6565b6139418185614403565b9350613951818560208601614582565b61395a816147ef565b840191505092915050565b6000613970826143d6565b61397a8185614414565b935061398a818560208601614582565b80840191505092915050565b60006139a3601383614403565b91506139ae82614800565b602082019050919050565b60006139c6602b83614403565b91506139d182614829565b604082019050919050565b60006139e9603283614403565b91506139f482614878565b604082019050919050565b6000613a0c602683614403565b9150613a17826148c7565b604082019050919050565b6000613a2f601183614403565b9150613a3a82614916565b602082019050919050565b6000613a52601c83614403565b9150613a5d8261493f565b602082019050919050565b6000613a75602483614403565b9150613a8082614968565b604082019050919050565b6000613a98601983614403565b9150613aa3826149b7565b602082019050919050565b6000613abb602c83614403565b9150613ac6826149e0565b604082019050919050565b6000613ade603883614403565b9150613ae982614a2f565b604082019050919050565b6000613b01600d83614403565b9150613b0c82614a7e565b602082019050919050565b6000613b24602a83614403565b9150613b2f82614aa7565b604082019050919050565b6000613b47602983614403565b9150613b5282614af6565b604082019050919050565b6000613b6a602083614403565b9150613b7582614b45565b602082019050919050565b6000613b8d601183614403565b9150613b9882614b6e565b602082019050919050565b6000613bb0602c83614403565b9150613bbb82614b97565b604082019050919050565b6000613bd3600b83614403565b9150613bde82614be6565b602082019050919050565b6000613bf6601283614403565b9150613c0182614c0f565b602082019050919050565b6000613c19602083614403565b9150613c2482614c38565b602082019050919050565b6000613c3c602983614403565b9150613c4782614c61565b604082019050919050565b6000613c5f602183614403565b9150613c6a82614cb0565b604082019050919050565b6000613c82601483614403565b9150613c8d82614cff565b602082019050919050565b6000613ca5603183614403565b9150613cb082614d28565b604082019050919050565b6000613cc8602c83614403565b9150613cd382614d77565b604082019050919050565b6000613ceb601183614403565b9150613cf682614dc6565b602082019050919050565b6000613d0e601383614403565b9150613d1982614def565b602082019050919050565b6000613d31601f83614403565b9150613d3c82614e18565b602082019050919050565b6000613d54600f83614403565b9150613d5f82614e41565b602082019050919050565b600061014083016000830151613d836000860182613e86565b506020830151613d966020860182613e86565b506040830151613da96040860182613e86565b506060830151613dbc6060860182613e86565b506080830151613dcf6080860182613e86565b5060a0830151613de260a0860182613e86565b5060c0830151613df560c0860182613e86565b5060e0830151613e0860e0860182613e86565b50610100830151848203610100860152613e2282826138f3565b915050610120830151613e3961012086018261388d565b508091505092915050565b606082016000820151613e5a6000850182613e86565b506020820151613e6d6020850182613e86565b506040820151613e8060408501826138e4565b50505050565b613e8f81614557565b82525050565b613e9e81614557565b82525050565b6000613eb08285613965565b9150613ebc8284613965565b91508190509392505050565b6000602082019050613edd600083018461387e565b92915050565b6000608082019050613ef8600083018761387e565b613f05602083018661387e565b613f126040830185613e95565b8181036060830152613f2481846138ab565b905095945050505050565b6000602082019050613f44600083018461389c565b92915050565b60006020820190508181036000830152613f64818461392c565b905092915050565b60006020820190508181036000830152613f8581613996565b9050919050565b60006020820190508181036000830152613fa5816139b9565b9050919050565b60006020820190508181036000830152613fc5816139dc565b9050919050565b60006020820190508181036000830152613fe5816139ff565b9050919050565b6000602082019050818103600083015261400581613a22565b9050919050565b6000602082019050818103600083015261402581613a45565b9050919050565b6000602082019050818103600083015261404581613a68565b9050919050565b6000602082019050818103600083015261406581613a8b565b9050919050565b6000602082019050818103600083015261408581613aae565b9050919050565b600060208201905081810360008301526140a581613ad1565b9050919050565b600060208201905081810360008301526140c581613af4565b9050919050565b600060208201905081810360008301526140e581613b17565b9050919050565b6000602082019050818103600083015261410581613b3a565b9050919050565b6000602082019050818103600083015261412581613b5d565b9050919050565b6000602082019050818103600083015261414581613b80565b9050919050565b6000602082019050818103600083015261416581613ba3565b9050919050565b6000602082019050818103600083015261418581613bc6565b9050919050565b600060208201905081810360008301526141a581613be9565b9050919050565b600060208201905081810360008301526141c581613c0c565b9050919050565b600060208201905081810360008301526141e581613c2f565b9050919050565b6000602082019050818103600083015261420581613c52565b9050919050565b6000602082019050818103600083015261422581613c75565b9050919050565b6000602082019050818103600083015261424581613c98565b9050919050565b6000602082019050818103600083015261426581613cbb565b9050919050565b6000602082019050818103600083015261428581613cde565b9050919050565b600060208201905081810360008301526142a581613d01565b9050919050565b600060208201905081810360008301526142c581613d24565b9050919050565b600060208201905081810360008301526142e581613d47565b9050919050565b600060208201905081810360008301526143068184613d6a565b905092915050565b60006060820190506143236000830184613e44565b92915050565b600060208201905061433e6000830184613e95565b92915050565b600061434e61435f565b905061435a82826145e7565b919050565b6000604051905090565b600067ffffffffffffffff821115614384576143836147ac565b5b61438d826147ef565b9050602081019050919050565b600067ffffffffffffffff8211156143b5576143b46147ac565b5b6143be826147ef565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061442a82614557565b915061443583614557565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561446a57614469614692565b5b828201905092915050565b600061448082614557565b915061448b83614557565b92508261449b5761449a6146c1565b5b828204905092915050565b60006144b182614557565b91506144bc83614557565b9250828210156144cf576144ce614692565b5b828203905092915050565b60006144e582614537565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061453282614e6a565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061456c82614524565b9050919050565b82818337600083830152505050565b60005b838110156145a0578082015181840152602081019050614585565b838111156145af576000848401525b50505050565b600060028204905060018216806145cd57607f821691505b602082108114156145e1576145e061471f565b5b50919050565b6145f0826147ef565b810181811067ffffffffffffffff8211171561460f5761460e6147ac565b5b80604052505050565b600061462382614557565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561465657614655614692565b5b600182019050919050565b600061466c82614557565b915061467783614557565b925082614687576146866146c1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f48543a206e6f20666972737445646974696f6e00000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f48543a20696e76616c6964206973737565000000000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f48543a204e6f74206f776e657200000000000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f55543a20696e76616c6964206973737565000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f48543a206e6f20676f6c64000000000000000000000000000000000000000000600082015250565b7f48543a206e6f20686f6c6f677261706869630000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f48543a20616c72656164792072656465656d6564000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f55543a20696e76616c696420746f6b656e000000000000000000000000000000600082015250565b7f48543a206973206e6f74206275726e61626c6500000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f48543a204f6e6c79206d696e7465720000000000000000000000000000000000600082015250565b60038110614e7b57614e7a6146f0565b5b50565b614e87816144da565b8114614e9257600080fd5b50565b614e9e816144ec565b8114614ea957600080fd5b50565b614eb5816144f8565b8114614ec057600080fd5b50565b60038110614ed057600080fd5b50565b614edc81614557565b8114614ee757600080fd5b5056fea2646970667358221220c69f88cbd46ec40449eae2d2a02a485a487440707178ebb5e267143590875ef864736f6c63430008060033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061021c5760003560e01c806370a0823111610125578063beb65893116100ad578063c8ae3bc81161007c578063c8ae3bc81461064d578063e4b50cb814610669578063e985e9c514610699578063eb91d37e146106c9578063f2fde38b146106e75761021c565b8063beb65893146105b3578063c063e5be146105e3578063c1eb1840146105ff578063c87b56dd1461061d5761021c565b806395d89b41116100f457806395d89b411461050f578063976b31131461052d5780639cd0c2db1461055d578063a22cb4651461057b578063b88d4fde146105975761021c565b806370a0823114610499578063715018a6146104c9578063858e86ea146104d35780638da5cb5b146104f15761021c565b806333cfcb9f116101a857806342966c681161017757806342966c68146103e55780634eb03f6e146104015780634f6ccce71461041d578063573ee57a1461044d5780636352211e146104695761021c565b806333cfcb9f14610361578063386c69f21461037d57806340d097c31461039957806342842e0e146103c95761021c565b8063095ea7b3116101ef578063095ea7b3146102bd57806317d70f7c146102d957806318160ddd146102f757806323b872dd146103155780632f745c59146103315761021c565b806301ffc9a71461022157806306fdde0314610251578063075461721461026f578063081812fc1461028d575b600080fd5b61023b60048036038101906102369190613675565b610703565b6040516102489190613f2f565b60405180910390f35b61025961077d565b6040516102669190613f4a565b60405180910390f35b61027761080f565b6040516102849190613ec8565b60405180910390f35b6102a760048036038101906102a291906136cf565b610835565b6040516102b49190613ec8565b60405180910390f35b6102d760048036038101906102d29190613608565b6108ba565b005b6102e16109d2565b6040516102ee9190614329565b60405180910390f35b6102ff6109d8565b60405161030c9190614329565b60405180910390f35b61032f600480360381019061032a91906134f2565b6109e5565b005b61034b60048036038101906103469190613608565b610a45565b6040516103589190614329565b60405180910390f35b61037b6004803603810190610376919061373c565b610aea565b005b61039760048036038101906103929190613648565b610bf7565b005b6103b360048036038101906103ae9190613485565b610ca4565b6040516103c09190614329565b60405180910390f35b6103e360048036038101906103de91906134f2565b610dba565b005b6103ff60048036038101906103fa91906136cf565b610dda565b005b61041b60048036038101906104169190613485565b610eab565b005b610437600480360381019061043291906136cf565b610f6b565b6040516104449190614329565b60405180910390f35b610467600480360381019061046291906136fc565b610fdc565b005b610483600480360381019061047e91906136cf565b61136e565b6040516104909190613ec8565b60405180910390f35b6104b360048036038101906104ae9190613485565b611420565b6040516104c09190614329565b60405180910390f35b6104d16114d8565b005b6104db611560565b6040516104e89190614329565b60405180910390f35b6104f961156a565b6040516105069190613ec8565b60405180910390f35b610517611594565b6040516105249190613f4a565b60405180910390f35b610547600480360381019061054291906136cf565b611626565b60405161055491906142ec565b60405180910390f35b610565611751565b6040516105729190614329565b60405180910390f35b610595600480360381019061059091906135c8565b61175b565b005b6105b160048036038101906105ac9190613545565b6118dc565b005b6105cd60048036038101906105c891906136cf565b61193e565b6040516105da9190613f2f565b60405180910390f35b6105fd60048036038101906105f891906136cf565b61195e565b005b610607611a6a565b6040516106149190613f2f565b60405180910390f35b610637600480360381019061063291906136cf565b611a7d565b6040516106449190613f4a565b60405180910390f35b61066760048036038101906106629190613798565b611d02565b005b610683600480360381019061067e91906136cf565b611e58565b604051610690919061430e565b60405180910390f35b6106b360048036038101906106ae91906134b2565b611ed4565b6040516106c09190613f2f565b60405180910390f35b6106d1611f68565b6040516106de9190614329565b60405180910390f35b61070160048036038101906106fc9190613485565b611f72565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061077657506107758261206a565b5b9050919050565b60606000805461078c906145b5565b80601f01602080910402602001604051908101604052809291908181526020018280546107b8906145b5565b80156108055780601f106107da57610100808354040283529160200191610805565b820191906000526020600020905b8154815290600101906020018083116107e857829003601f168201915b5050505050905090565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006108408261214c565b61087f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108769061414c565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108c58261136e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610936576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092d906141ec565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109556121b8565b73ffffffffffffffffffffffffffffffffffffffff16148061098457506109838161097e6121b8565b611ed4565b5b6109c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ba9061408c565b60405180910390fd5b6109cd83836121c0565b505050565b600d5481565b6000600880549050905090565b6109f66109f06121b8565b82612279565b610a35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2c9061422c565b60405180910390fd5b610a40838383612357565b505050565b6000610a5083611420565b8210610a91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8890613f8c565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b71906142cc565b60405180910390fd5b610b83826125b3565b610bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb99061412c565b60405180910390fd5b600060116000848152602001908152602001600020905081816008019080519060200190610bf19291906131fc565b50505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7e906142cc565b60405180910390fd5b80600c60146101000a81548160ff02191690831515021790555050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d906142cc565b60405180910390fd5b6002600a541415610d7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d73906142ac565b60405180910390fd5b6002600a81905550600d6000815480929190610d9790614618565b9190505550610da882600d546125ee565b600d5490506001600a81905550919050565b610dd5838383604051806020016040528060008152506118dc565b505050565b600c60149054906101000a900460ff16610e29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e209061428c565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16610e498261136e565b73ffffffffffffffffffffffffffffffffffffffff1614610e9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e96906140ac565b60405180910390fd5b610ea88161260c565b50565b610eb36121b8565b73ffffffffffffffffffffffffffffffffffffffff16610ed161156a565b73ffffffffffffffffffffffffffffffffffffffff1614610f27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1e906141ac565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610f756109d8565b8210610fb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fad9061424c565b60405180910390fd5b60088281548110610fca57610fc961477d565b5b90600052602060002001549050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461106c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611063906142cc565b60405180910390fd5b6000601360008481526020019081526020016000209050600e548160010181905550600060116000600e5481526020019081526020016000209050600160028111156110bb576110ba6146f0565b5b8360028111156110ce576110cd6146f0565b5b14156111905760008160010154905060008111611120576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111179061416c565b60405180910390fd5b60018161112d91906144a6565b826001018190555060008260040154905060018161114b919061441f565b836004018190555060018460020160006101000a81548160ff0219169083600281111561117b5761117a6146f0565b5b02179055508084600001819055505050611368565b600060028111156111a4576111a36146f0565b5b8360028111156111b7576111b66146f0565b5b14156112795760008160020154905060008111611209576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120090613f6c565b60405180910390fd5b60018161121691906144a6565b8260020181905550600082600501549050600181611234919061441f565b836005018190555060008460020160006101000a81548160ff02191690836002811115611264576112636146f0565b5b02179055508084600001819055505050611367565b60028081111561128c5761128b6146f0565b5b83600281111561129f5761129e6146f0565b5b141561136157600081600301549050600081116112f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e89061418c565b60405180910390fd5b6001816112fe91906144a6565b826003018190555060008260060154905060018161131c919061441f565b836006018190555060028460020160006101000a81548160ff0219169083600281111561134c5761134b6146f0565b5b02179055508084600001819055505050611366565b600080fd5b5b5b50505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611417576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140e906140ec565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611491576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611488906140cc565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6114e06121b8565b73ffffffffffffffffffffffffffffffffffffffff166114fe61156a565b73ffffffffffffffffffffffffffffffffffffffff1614611554576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154b906141ac565b60405180910390fd5b61155e600061271d565b565b6000601054905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546115a3906145b5565b80601f01602080910402602001604051908101604052809291908181526020018280546115cf906145b5565b801561161c5780601f106115f15761010080835404028352916020019161161c565b820191906000526020600020905b8154815290600101906020018083116115ff57829003601f168201915b5050505050905090565b61162e613282565b601160008381526020019081526020016000206040518061014001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820180546116ad906145b5565b80601f01602080910402602001604051908101604052809291908181526020018280546116d9906145b5565b80156117265780601f106116fb57610100808354040283529160200191611726565b820191906000526020600020905b81548152906001019060200180831161170957829003601f168201915b505050505081526020016009820160009054906101000a900460ff1615151515815250509050919050565b6000600e54905090565b6117636121b8565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c89061404c565b60405180910390fd5b80600560006117de6121b8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661188b6121b8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118d09190613f2f565b60405180910390a35050565b6118ed6118e76121b8565b83612279565b61192c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119239061422c565b60405180910390fd5b611938848484846127e3565b50505050565b60126020528060005260406000206000915054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff1661197e8261136e565b73ffffffffffffffffffffffffffffffffffffffff16146119d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cb906140ac565b60405180910390fd5b600015156012600083815260200190815260200160002060009054906101000a900460ff16151514611a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a329061420c565b60405180910390fd5b60016012600083815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600c60149054906101000a900460ff1681565b6060611a888261214c565b611ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abe9061426c565b60405180910390fd5b60006013600084815260200190815260200160002060405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900460ff166002811115611b2057611b1f6146f0565b5b6002811115611b3257611b316146f0565b5b81525050905060008160200151905060008111611b84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7b90613fec565b60405180910390fd5b600060116000838152602001908152602001600020604051806101400160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882018054611c05906145b5565b80601f0160208091040260200160405190810160405280929190818152602001828054611c31906145b5565b8015611c7e5780601f10611c5357610100808354040283529160200191611c7e565b820191906000526020600020905b815481529060010190602001808311611c6157829003601f168201915b505050505081526020016009820160009054906101000a900460ff1615151515815250509050600081610100015190506000815111611ccc5760405180602001604052806000815250611cf7565b80611cd68761283f565b604051602001611ce7929190613ea4565b6040516020818303038152906040525b945050505050919050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d89906142cc565b60405180910390fd5b6001600e54611da1919061441f565b600e8190555088600f8190555081601081905550600060116000600e548152602001908152602001600020905089816000018190555088816001018190555087816002018190555086816003018190555085816004018190555084816005018190555083816006018190555082816007018190555081816008019080519060200190611e2e9291906131fc565b5060018160090160006101000a81548160ff02191690831515021790555050505050505050505050565b611e606132d7565b6013600083815260200190815260200160002060405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900460ff166002811115611eb757611eb66146f0565b5b6002811115611ec957611ec86146f0565b5b815250509050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600f54905090565b611f7a6121b8565b73ffffffffffffffffffffffffffffffffffffffff16611f9861156a565b73ffffffffffffffffffffffffffffffffffffffff1614611fee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe5906141ac565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561205e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205590613fcc565b60405180910390fd5b6120678161271d565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061213557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806121455750612144826129a0565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166122338361136e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006122848261214c565b6122c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ba9061406c565b60405180910390fd5b60006122ce8361136e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061233d57508373ffffffffffffffffffffffffffffffffffffffff1661232584610835565b73ffffffffffffffffffffffffffffffffffffffff16145b8061234e575061234d8185611ed4565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166123778261136e565b73ffffffffffffffffffffffffffffffffffffffff16146123cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c4906141cc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561243d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124349061402c565b60405180910390fd5b612448838383612a0a565b6124536000826121c0565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124a391906144a6565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124fa919061441f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006011600083815260200190815260200160002060090160009054906101000a900460ff166125e45760006125e7565b60015b9050919050565b612608828260405180602001604052806000815250612b1e565b5050565b60006126178261136e565b905061262581600084612a0a565b6126306000836121c0565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461268091906144a6565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6127ee848484612357565b6127fa84848484612b79565b612839576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283090613fac565b60405180910390fd5b50505050565b60606000821415612887576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061299b565b600082905060005b600082146128b95780806128a290614618565b915050600a826128b29190614475565b915061288f565b60008167ffffffffffffffff8111156128d5576128d46147ac565b5b6040519080825280601f01601f1916602001820160405280156129075781602001600182028036833780820191505090505b5090505b600085146129945760018261292091906144a6565b9150600a8561292f9190614661565b603061293b919061441f565b60f81b8183815181106129515761295061477d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561298d9190614475565b945061290b565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612a15838383612d10565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a5857612a5381612d15565b612a97565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612a9657612a958382612d5e565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ada57612ad581612ecb565b612b19565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612b1857612b178282612f9c565b5b5b505050565b612b28838361301b565b612b356000848484612b79565b612b74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6b90613fac565b60405180910390fd5b505050565b6000612b9a8473ffffffffffffffffffffffffffffffffffffffff166131e9565b15612d03578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612bc36121b8565b8786866040518563ffffffff1660e01b8152600401612be59493929190613ee3565b602060405180830381600087803b158015612bff57600080fd5b505af1925050508015612c3057506040513d601f19601f82011682018060405250810190612c2d91906136a2565b60015b612cb3573d8060008114612c60576040519150601f19603f3d011682016040523d82523d6000602084013e612c65565b606091505b50600081511415612cab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca290613fac565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d08565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612d6b84611420565b612d7591906144a6565b9050600060076000848152602001908152602001600020549050818114612e5a576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612edf91906144a6565b9050600060096000848152602001908152602001600020549050600060088381548110612f0f57612f0e61477d565b5b906000526020600020015490508060088381548110612f3157612f3061477d565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612f8057612f7f61474e565b5b6001900381819060005260206000200160009055905550505050565b6000612fa783611420565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561308b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130829061410c565b60405180910390fd5b6130948161214c565b156130d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130cb9061400c565b60405180910390fd5b6130e060008383612a0a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613130919061441f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054613208906145b5565b90600052602060002090601f01602090048101928261322a5760008555613271565b82601f1061324357805160ff1916838001178555613271565b82800160010185558215613271579182015b82811115613270578251825591602001919060010190613255565b5b50905061327e919061330a565b5090565b6040518061014001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001606081526020016000151581525090565b6040518060600160405280600081526020016000815260200160006002811115613304576133036146f0565b5b81525090565b5b8082111561332357600081600090555060010161330b565b5090565b600061333a61333584614369565b614344565b905082815260208101848484011115613356576133556147e0565b5b613361848285614573565b509392505050565b600061337c6133778461439a565b614344565b905082815260208101848484011115613398576133976147e0565b5b6133a3848285614573565b509392505050565b6000813590506133ba81614e7e565b92915050565b6000813590506133cf81614e95565b92915050565b6000813590506133e481614eac565b92915050565b6000815190506133f981614eac565b92915050565b600082601f830112613414576134136147db565b5b8135613424848260208601613327565b91505092915050565b60008135905061343c81614ec3565b92915050565b600082601f830112613457576134566147db565b5b8135613467848260208601613369565b91505092915050565b60008135905061347f81614ed3565b92915050565b60006020828403121561349b5761349a6147ea565b5b60006134a9848285016133ab565b91505092915050565b600080604083850312156134c9576134c86147ea565b5b60006134d7858286016133ab565b92505060206134e8858286016133ab565b9150509250929050565b60008060006060848603121561350b5761350a6147ea565b5b6000613519868287016133ab565b935050602061352a868287016133ab565b925050604061353b86828701613470565b9150509250925092565b6000806000806080858703121561355f5761355e6147ea565b5b600061356d878288016133ab565b945050602061357e878288016133ab565b935050604061358f87828801613470565b925050606085013567ffffffffffffffff8111156135b0576135af6147e5565b5b6135bc878288016133ff565b91505092959194509250565b600080604083850312156135df576135de6147ea565b5b60006135ed858286016133ab565b92505060206135fe858286016133c0565b9150509250929050565b6000806040838503121561361f5761361e6147ea565b5b600061362d858286016133ab565b925050602061363e85828601613470565b9150509250929050565b60006020828403121561365e5761365d6147ea565b5b600061366c848285016133c0565b91505092915050565b60006020828403121561368b5761368a6147ea565b5b6000613699848285016133d5565b91505092915050565b6000602082840312156136b8576136b76147ea565b5b60006136c6848285016133ea565b91505092915050565b6000602082840312156136e5576136e46147ea565b5b60006136f384828501613470565b91505092915050565b60008060408385031215613713576137126147ea565b5b600061372185828601613470565b92505060206137328582860161342d565b9150509250929050565b60008060408385031215613753576137526147ea565b5b600061376185828601613470565b925050602083013567ffffffffffffffff811115613782576137816147e5565b5b61378e85828601613442565b9150509250929050565b60008060008060008060008060006101208a8c0312156137bb576137ba6147ea565b5b60006137c98c828d01613470565b99505060206137da8c828d01613470565b98505060406137eb8c828d01613470565b97505060606137fc8c828d01613470565b965050608061380d8c828d01613470565b95505060a061381e8c828d01613470565b94505060c061382f8c828d01613470565b93505060e06138408c828d01613470565b9250506101008a013567ffffffffffffffff811115613862576138616147e5565b5b61386e8c828d01613442565b9150509295985092959850929598565b613887816144da565b82525050565b613896816144ec565b82525050565b6138a5816144ec565b82525050565b60006138b6826143cb565b6138c081856143e1565b93506138d0818560208601614582565b6138d9816147ef565b840191505092915050565b6138ed81614561565b82525050565b60006138fe826143d6565b61390881856143f2565b9350613918818560208601614582565b613921816147ef565b840191505092915050565b6000613937826143d6565b6139418185614403565b9350613951818560208601614582565b61395a816147ef565b840191505092915050565b6000613970826143d6565b61397a8185614414565b935061398a818560208601614582565b80840191505092915050565b60006139a3601383614403565b91506139ae82614800565b602082019050919050565b60006139c6602b83614403565b91506139d182614829565b604082019050919050565b60006139e9603283614403565b91506139f482614878565b604082019050919050565b6000613a0c602683614403565b9150613a17826148c7565b604082019050919050565b6000613a2f601183614403565b9150613a3a82614916565b602082019050919050565b6000613a52601c83614403565b9150613a5d8261493f565b602082019050919050565b6000613a75602483614403565b9150613a8082614968565b604082019050919050565b6000613a98601983614403565b9150613aa3826149b7565b602082019050919050565b6000613abb602c83614403565b9150613ac6826149e0565b604082019050919050565b6000613ade603883614403565b9150613ae982614a2f565b604082019050919050565b6000613b01600d83614403565b9150613b0c82614a7e565b602082019050919050565b6000613b24602a83614403565b9150613b2f82614aa7565b604082019050919050565b6000613b47602983614403565b9150613b5282614af6565b604082019050919050565b6000613b6a602083614403565b9150613b7582614b45565b602082019050919050565b6000613b8d601183614403565b9150613b9882614b6e565b602082019050919050565b6000613bb0602c83614403565b9150613bbb82614b97565b604082019050919050565b6000613bd3600b83614403565b9150613bde82614be6565b602082019050919050565b6000613bf6601283614403565b9150613c0182614c0f565b602082019050919050565b6000613c19602083614403565b9150613c2482614c38565b602082019050919050565b6000613c3c602983614403565b9150613c4782614c61565b604082019050919050565b6000613c5f602183614403565b9150613c6a82614cb0565b604082019050919050565b6000613c82601483614403565b9150613c8d82614cff565b602082019050919050565b6000613ca5603183614403565b9150613cb082614d28565b604082019050919050565b6000613cc8602c83614403565b9150613cd382614d77565b604082019050919050565b6000613ceb601183614403565b9150613cf682614dc6565b602082019050919050565b6000613d0e601383614403565b9150613d1982614def565b602082019050919050565b6000613d31601f83614403565b9150613d3c82614e18565b602082019050919050565b6000613d54600f83614403565b9150613d5f82614e41565b602082019050919050565b600061014083016000830151613d836000860182613e86565b506020830151613d966020860182613e86565b506040830151613da96040860182613e86565b506060830151613dbc6060860182613e86565b506080830151613dcf6080860182613e86565b5060a0830151613de260a0860182613e86565b5060c0830151613df560c0860182613e86565b5060e0830151613e0860e0860182613e86565b50610100830151848203610100860152613e2282826138f3565b915050610120830151613e3961012086018261388d565b508091505092915050565b606082016000820151613e5a6000850182613e86565b506020820151613e6d6020850182613e86565b506040820151613e8060408501826138e4565b50505050565b613e8f81614557565b82525050565b613e9e81614557565b82525050565b6000613eb08285613965565b9150613ebc8284613965565b91508190509392505050565b6000602082019050613edd600083018461387e565b92915050565b6000608082019050613ef8600083018761387e565b613f05602083018661387e565b613f126040830185613e95565b8181036060830152613f2481846138ab565b905095945050505050565b6000602082019050613f44600083018461389c565b92915050565b60006020820190508181036000830152613f64818461392c565b905092915050565b60006020820190508181036000830152613f8581613996565b9050919050565b60006020820190508181036000830152613fa5816139b9565b9050919050565b60006020820190508181036000830152613fc5816139dc565b9050919050565b60006020820190508181036000830152613fe5816139ff565b9050919050565b6000602082019050818103600083015261400581613a22565b9050919050565b6000602082019050818103600083015261402581613a45565b9050919050565b6000602082019050818103600083015261404581613a68565b9050919050565b6000602082019050818103600083015261406581613a8b565b9050919050565b6000602082019050818103600083015261408581613aae565b9050919050565b600060208201905081810360008301526140a581613ad1565b9050919050565b600060208201905081810360008301526140c581613af4565b9050919050565b600060208201905081810360008301526140e581613b17565b9050919050565b6000602082019050818103600083015261410581613b3a565b9050919050565b6000602082019050818103600083015261412581613b5d565b9050919050565b6000602082019050818103600083015261414581613b80565b9050919050565b6000602082019050818103600083015261416581613ba3565b9050919050565b6000602082019050818103600083015261418581613bc6565b9050919050565b600060208201905081810360008301526141a581613be9565b9050919050565b600060208201905081810360008301526141c581613c0c565b9050919050565b600060208201905081810360008301526141e581613c2f565b9050919050565b6000602082019050818103600083015261420581613c52565b9050919050565b6000602082019050818103600083015261422581613c75565b9050919050565b6000602082019050818103600083015261424581613c98565b9050919050565b6000602082019050818103600083015261426581613cbb565b9050919050565b6000602082019050818103600083015261428581613cde565b9050919050565b600060208201905081810360008301526142a581613d01565b9050919050565b600060208201905081810360008301526142c581613d24565b9050919050565b600060208201905081810360008301526142e581613d47565b9050919050565b600060208201905081810360008301526143068184613d6a565b905092915050565b60006060820190506143236000830184613e44565b92915050565b600060208201905061433e6000830184613e95565b92915050565b600061434e61435f565b905061435a82826145e7565b919050565b6000604051905090565b600067ffffffffffffffff821115614384576143836147ac565b5b61438d826147ef565b9050602081019050919050565b600067ffffffffffffffff8211156143b5576143b46147ac565b5b6143be826147ef565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061442a82614557565b915061443583614557565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561446a57614469614692565b5b828201905092915050565b600061448082614557565b915061448b83614557565b92508261449b5761449a6146c1565b5b828204905092915050565b60006144b182614557565b91506144bc83614557565b9250828210156144cf576144ce614692565b5b828203905092915050565b60006144e582614537565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600081905061453282614e6a565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061456c82614524565b9050919050565b82818337600083830152505050565b60005b838110156145a0578082015181840152602081019050614585565b838111156145af576000848401525b50505050565b600060028204905060018216806145cd57607f821691505b602082108114156145e1576145e061471f565b5b50919050565b6145f0826147ef565b810181811067ffffffffffffffff8211171561460f5761460e6147ac565b5b80604052505050565b600061462382614557565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561465657614655614692565b5b600182019050919050565b600061466c82614557565b915061467783614557565b925082614687576146866146c1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f48543a206e6f20666972737445646974696f6e00000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f48543a20696e76616c6964206973737565000000000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f48543a204e6f74206f776e657200000000000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f55543a20696e76616c6964206973737565000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f48543a206e6f20676f6c64000000000000000000000000000000000000000000600082015250565b7f48543a206e6f20686f6c6f677261706869630000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f48543a20616c72656164792072656465656d6564000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f55543a20696e76616c696420746f6b656e000000000000000000000000000000600082015250565b7f48543a206973206e6f74206275726e61626c6500000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f48543a204f6e6c79206d696e7465720000000000000000000000000000000000600082015250565b60038110614e7b57614e7a6146f0565b5b50565b614e87816144da565b8114614e9257600080fd5b50565b614e9e816144ec565b8114614ea957600080fd5b50565b614eb5816144f8565b8114614ec057600080fd5b50565b60038110614ed057600080fd5b50565b614edc81614557565b8114614ee757600080fd5b5056fea2646970667358221220c69f88cbd46ec40449eae2d2a02a485a487440707178ebb5e267143590875ef864736f6c63430008060033
Deployed Bytecode Sourcemap
47441:9619:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38528:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25429:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47634:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26988:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26511:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47786:22;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39168:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27878:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38836:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54797:248;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56928:101;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48938:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28288:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49277:199;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56719:93;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39358:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52036:1973;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25123:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24853:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9928:94;;;:::i;:::-;;55499:162;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9277:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25598:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55969:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55101:120;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27281:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28544:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48223:43;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56375:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47729:19;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54092:562;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50314:1128;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56199:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27647:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55286:120;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10177:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38528:224;38630:4;38669:35;38654:50;;;:11;:50;;;;:90;;;;38708:36;38732:11;38708:23;:36::i;:::-;38654:90;38647:97;;38528:224;;;:::o;25429:100::-;25483:13;25516:5;25509:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25429:100;:::o;47634:21::-;;;;;;;;;;;;;:::o;26988:221::-;27064:7;27092:16;27100:7;27092;:16::i;:::-;27084:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27177:15;:24;27193:7;27177:24;;;;;;;;;;;;;;;;;;;;;27170:31;;26988:221;;;:::o;26511:411::-;26592:13;26608:23;26623:7;26608:14;:23::i;:::-;26592:39;;26656:5;26650:11;;:2;:11;;;;26642:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26750:5;26734:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26759:37;26776:5;26783:12;:10;:12::i;:::-;26759:16;:37::i;:::-;26734:62;26712:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;26893:21;26902:2;26906:7;26893:8;:21::i;:::-;26581:341;26511:411;;:::o;47786:22::-;;;;:::o;39168:113::-;39229:7;39256:10;:17;;;;39249:24;;39168:113;:::o;27878:339::-;28073:41;28092:12;:10;:12::i;:::-;28106:7;28073:18;:41::i;:::-;28065:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28181:28;28191:4;28197:2;28201:7;28181:9;:28::i;:::-;27878:339;;;:::o;38836:256::-;38933:7;38969:23;38986:5;38969:16;:23::i;:::-;38961:5;:31;38953:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;39058:12;:19;39071:5;39058:19;;;;;;;;;;;;;;;:26;39078:5;39058:26;;;;;;;;;;;;39051:33;;38836:256;;;;:::o;54797:248::-;48544:6;;;;;;;;;;;48530:20;;:10;:20;;;48522:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;54907:26:::1;54920:12;54907;:26::i;:::-;54899:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;54968:19;54990:6;:20;54997:12;54990:20;;;;;;;;;;;54968:42;;55033:4;55021:5;:9;;:16;;;;;;;;;;;;:::i;:::-;;54888:157;54797:248:::0;;:::o;56928:101::-;48544:6;;;;;;;;;;;48530:20;;:10;:20;;;48522:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;57013:8:::1;57003:7;;:18;;;;;;;;;;;;;;;;;;56928:101:::0;:::o;48938:193::-;49021:16;48544:6;;;;;;;;;;;48530:20;;:10;:20;;;48522:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;46421:1:::1;47017:7;;:19;;47009:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;46421:1;47150:7;:18;;;;49050:7:::2;;:9;;;;;;;;;:::i;:::-;;;;;;49070:28;49086:2;49090:7;;49070:15;:28::i;:::-;49116:7;;49109:14;;46377:1:::1;47329:7;:22;;;;48938:193:::0;;;:::o;28288:185::-;28426:39;28443:4;28449:2;28453:7;28426:39;;;;;;;;;;;;:16;:39::i;:::-;28288:185;;;:::o;49277:199::-;49337:7;;;;;;;;;;;49329:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;49408:10;49387:31;;:17;49395:8;49387:7;:17::i;:::-;:31;;;49379:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;49447:21;49459:8;49447:11;:21::i;:::-;49277:199;:::o;56719:93::-;9508:12;:10;:12::i;:::-;9497:23;;:7;:5;:7::i;:::-;:23;;;9489:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56797:7:::1;56788:6;;:16;;;;;;;;;;;;;;;;;;56719:93:::0;:::o;39358:233::-;39433:7;39469:30;:28;:30::i;:::-;39461:5;:38;39453:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;39566:10;39577:5;39566:17;;;;;;;;:::i;:::-;;;;;;;;;;39559:24;;39358:233;;;:::o;52036:1973::-;48544:6;;;;;;;;;;;48530:20;;:10;:20;;;48522:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;52141:19:::1;52163:6;:16;52170:8;52163:16;;;;;;;;;;;52141:38;;52210:12;;52190:5;:17;;:32;;;;52235:19;52257:6;:20;52264:12;;52257:20;;;;;;;;;;;52235:42;;52362:14;52348:28;;;;;;;;:::i;:::-;;:10;:28;;;;;;;;:::i;:::-;;;52344:1658;;;52393:22;52418:5;:20;;;52393:45;;52478:1;52461:14;:18;52453:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;52552:1;52535:14;:18;;;;:::i;:::-;52512:5;:20;;:41;;;;52568:24;52595:5;:28;;;52568:55;;52688:1;52669:16;:20;;;;:::i;:::-;52638:5;:28;;:51;;;;52736:14;52718:5;:15;;;:32;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;52786:16;52765:5;:18;;:37;;;;52378:436;;52344:1658;;;52838:22;52824:36;;;;;;;;:::i;:::-;;:10;:36;;;;;;;;:::i;:::-;;;52820:1182;;;52877:30;52910:5;:28;;;52877:61;;52986:1;52961:22;:26;52953:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;53084:1;53059:22;:26;;;;:::i;:::-;53028:5;:28;;:57;;;;53100:32;53135:5;:36;;;53100:71;;53252:1;53225:24;:28;;;;:::i;:::-;53186:5;:36;;:67;;;;53300:22;53282:5;:15;;;:40;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;53358:24;53337:5;:18;;:45;;;;52862:532;;52820:1182;;;53418:21;53404:35:::0;::::1;;;;;;;:::i;:::-;;:10;:35;;;;;;;;:::i;:::-;;;53400:602;;;53456:29;53488:5;:27;;;53456:59;;53562:1;53538:21;:25;53530:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;53657:1;53633:21;:25;;;;:::i;:::-;53603:5;:27;;:55;;;;53673:31;53707:5;:35;;;53673:69;;53821:1;53795:23;:27;;;;:::i;:::-;53757:5;:35;;:65;;;;53869:21;53851:5;:15;;;:39;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;53926:23;53905:5;:18;;:44;;;;53441:520;;53400:602;;;53982:8;::::0;::::1;53400:602;52820:1182;52344:1658;52130:1879;;52036:1973:::0;;:::o;25123:239::-;25195:7;25215:13;25231:7;:16;25239:7;25231:16;;;;;;;;;;;;;;;;;;;;;25215:32;;25283:1;25266:19;;:5;:19;;;;25258:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25349:5;25342:12;;;25123:239;;;:::o;24853:208::-;24925:7;24970:1;24953:19;;:5;:19;;;;24945:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;25037:9;:16;25047:5;25037:16;;;;;;;;;;;;;;;;25030:23;;24853:208;;;:::o;9928:94::-;9508:12;:10;:12::i;:::-;9497:23;;:7;:5;:7::i;:::-;:23;;;9489:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9993:21:::1;10011:1;9993:9;:21::i;:::-;9928:94::o:0;55499:162::-;55572:35;55627:26;;55620:33;;55499:162;:::o;9277:87::-;9323:7;9350:6;;;;;;;;;;;9343:13;;9277:87;:::o;25598:104::-;25654:13;25687:7;25680:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25598:104;:::o;55969:139::-;56041:19;;:::i;:::-;56080:6;:20;56087:12;56080:20;;;;;;;;;;;56073:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55969:139;;;:::o;55101:120::-;55160:21;55201:12;;55194:19;;55101:120;:::o;27281:295::-;27396:12;:10;:12::i;:::-;27384:24;;:8;:24;;;;27376:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;27496:8;27451:18;:32;27470:12;:10;:12::i;:::-;27451:32;;;;;;;;;;;;;;;:42;27484:8;27451:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;27549:8;27520:48;;27535:12;:10;:12::i;:::-;27520:48;;;27559:8;27520:48;;;;;;:::i;:::-;;;;;;;;27281:295;;:::o;28544:328::-;28719:41;28738:12;:10;:12::i;:::-;28752:7;28719:18;:41::i;:::-;28711:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28825:39;28839:4;28845:2;28849:7;28858:5;28825:13;:39::i;:::-;28544:328;;;;:::o;48223:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;56375:238::-;56462:10;56441:31;;:17;56449:8;56441:7;:17::i;:::-;:31;;;56433:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;56534:5;56509:30;;:11;:21;56521:8;56509:21;;;;;;;;;;;;;;;;;;;;;:30;;;56501:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;56601:4;56577:11;:21;56589:8;56577:21;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;56375:238;:::o;47729:19::-;;;;;;;;;;;;;:::o;54092:562::-;54166:13;54200:17;54208:8;54200:7;:17::i;:::-;54192:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;54252:18;54273:6;:16;54280:8;54273:16;;;;;;;;;;;54252:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;54300:19;54322:5;:17;;;54300:39;;54372:1;54358:11;:15;54350:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;54408:18;54429:6;:19;54436:11;54429:19;;;;;;;;;;;54408:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54459:21;54483:5;:9;;;54459:33;;54549:1;54531:7;54525:21;:25;:121;;;;;;;;;;;;;;;;;54594:7;54603:19;:8;:17;:19::i;:::-;54577:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54525:121;54505:141;;;;;;54092:562;;;:::o;50314:1128::-;48544:6;;;;;;;;;;;48530:20;;:10;:20;;;48522:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;50751:1:::1;50736:12;;:16;;;;:::i;:::-;50721:12;:31;;;;50778:6;50763:12;:21;;;;50824:20;50795:26;:49;;;;50857:19;50879:6;:20;50886:12;;50879:20;;;;;;;;;;;50857:42;;50926:6;50912:5;:11;;:20;;;;50966:11;50943:5;:20;;:34;;;;51019:19;50988:5;:28;;:50;;;;51079:18;51049:5;:27;;:48;;;;51139:22;51108:5;:28;;:53;;;;51211:30;51172:5;:36;;:69;;;;51290:29;51252:5;:35;;:67;;;;51358:20;51330:5;:25;;:48;;;;51401:4;51389:5;:9;;:16;;;;;;;;;;;;:::i;:::-;;51430:4;51416:5;:11;;;:18;;;;;;;;;;;;;;;;;;50710:732;50314:1128:::0;;;;;;;;;:::o;56199:131::-;56267:19;;:::i;:::-;56306:6;:16;56313:8;56306:16;;;;;;;;;;;56299:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;56199:131;;;:::o;27647:164::-;27744:4;27768:18;:25;27787:5;27768:25;;;;;;;;;;;;;;;:35;27794:8;27768:35;;;;;;;;;;;;;;;;;;;;;;;;;27761:42;;27647:164;;;;:::o;55286:120::-;55345:21;55386:12;;55379:19;;55286:120;:::o;10177:192::-;9508:12;:10;:12::i;:::-;9497:23;;:7;:5;:7::i;:::-;:23;;;9489:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10286:1:::1;10266:22;;:8;:22;;;;10258:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10342:19;10352:8;10342:9;:19::i;:::-;10177:192:::0;:::o;24484:305::-;24586:4;24638:25;24623:40;;;:11;:40;;;;:105;;;;24695:33;24680:48;;;:11;:48;;;;24623:105;:158;;;;24745:36;24769:11;24745:23;:36::i;:::-;24623:158;24603:178;;24484:305;;;:::o;30382:127::-;30447:4;30499:1;30471:30;;:7;:16;30479:7;30471:16;;;;;;;;;;;;;;;;;;;;;:30;;;;30464:37;;30382:127;;;:::o;8067:98::-;8120:7;8147:10;8140:17;;8067:98;:::o;34364:174::-;34466:2;34439:15;:24;34455:7;34439:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34522:7;34518:2;34484:46;;34493:23;34508:7;34493:14;:23::i;:::-;34484:46;;;;;;;;;;;;34364:174;;:::o;30676:348::-;30769:4;30794:16;30802:7;30794;:16::i;:::-;30786:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30870:13;30886:23;30901:7;30886:14;:23::i;:::-;30870:39;;30939:5;30928:16;;:7;:16;;;:51;;;;30972:7;30948:31;;:20;30960:7;30948:11;:20::i;:::-;:31;;;30928:51;:87;;;;30983:32;31000:5;31007:7;30983:16;:32::i;:::-;30928:87;30920:96;;;30676:348;;;;:::o;33668:578::-;33827:4;33800:31;;:23;33815:7;33800:14;:23::i;:::-;:31;;;33792:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;33910:1;33896:16;;:2;:16;;;;33888:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33966:39;33987:4;33993:2;33997:7;33966:20;:39::i;:::-;34070:29;34087:1;34091:7;34070:8;:29::i;:::-;34131:1;34112:9;:15;34122:4;34112:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34160:1;34143:9;:13;34153:2;34143:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34191:2;34172:7;:16;34180:7;34172:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34230:7;34226:2;34211:27;;34220:4;34211:27;;;;;;;;;;;;33668:578;;;:::o;51586:148::-;51661:4;51685:6;:20;51692:12;51685:20;;;;;;;;;;;:26;;;;;;;;;;;;:41;;51721:5;51685:41;;;51714:4;51685:41;51678:48;;51586:148;;;:::o;31366:110::-;31442:26;31452:2;31456:7;31442:26;;;;;;;;;;;;:9;:26::i;:::-;31366:110;;:::o;32971:360::-;33031:13;33047:23;33062:7;33047:14;:23::i;:::-;33031:39;;33083:48;33104:5;33119:1;33123:7;33083:20;:48::i;:::-;33172:29;33189:1;33193:7;33172:8;:29::i;:::-;33234:1;33214:9;:16;33224:5;33214:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;33253:7;:16;33261:7;33253:16;;;;;;;;;;;;33246:23;;;;;;;;;;;33315:7;33311:1;33287:36;;33296:5;33287:36;;;;;;;;;;;;33020:311;32971:360;:::o;10377:173::-;10433:16;10452:6;;;;;;;;;;;10433:25;;10478:8;10469:6;;:17;;;;;;;;;;;;;;;;;;10533:8;10502:40;;10523:8;10502:40;;;;;;;;;;;;10422:128;10377:173;:::o;29754:315::-;29911:28;29921:4;29927:2;29931:7;29911:9;:28::i;:::-;29958:48;29981:4;29987:2;29991:7;30000:5;29958:22;:48::i;:::-;29950:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;29754:315;;;;:::o;20435:723::-;20491:13;20721:1;20712:5;:10;20708:53;;;20739:10;;;;;;;;;;;;;;;;;;;;;20708:53;20771:12;20786:5;20771:20;;20802:14;20827:78;20842:1;20834:4;:9;20827:78;;20860:8;;;;;:::i;:::-;;;;20891:2;20883:10;;;;;:::i;:::-;;;20827:78;;;20915:19;20947:6;20937:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20915:39;;20965:154;20981:1;20972:5;:10;20965:154;;21009:1;20999:11;;;;;:::i;:::-;;;21076:2;21068:5;:10;;;;:::i;:::-;21055:2;:24;;;;:::i;:::-;21042:39;;21025:6;21032;21025:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;21105:2;21096:11;;;;;:::i;:::-;;;20965:154;;;21143:6;21129:21;;;;;20435:723;;;;:::o;22990:157::-;23075:4;23114:25;23099:40;;;:11;:40;;;;23092:47;;22990:157;;;:::o;40204:589::-;40348:45;40375:4;40381:2;40385:7;40348:26;:45::i;:::-;40426:1;40410:18;;:4;:18;;;40406:187;;;40445:40;40477:7;40445:31;:40::i;:::-;40406:187;;;40515:2;40507:10;;:4;:10;;;40503:90;;40534:47;40567:4;40573:7;40534:32;:47::i;:::-;40503:90;40406:187;40621:1;40607:16;;:2;:16;;;40603:183;;;40640:45;40677:7;40640:36;:45::i;:::-;40603:183;;;40713:4;40707:10;;:2;:10;;;40703:83;;40734:40;40762:2;40766:7;40734:27;:40::i;:::-;40703:83;40603:183;40204:589;;;:::o;31703:321::-;31833:18;31839:2;31843:7;31833:5;:18::i;:::-;31884:54;31915:1;31919:2;31923:7;31932:5;31884:22;:54::i;:::-;31862:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;31703:321;;;:::o;35103:803::-;35258:4;35279:15;:2;:13;;;:15::i;:::-;35275:624;;;35331:2;35315:36;;;35352:12;:10;:12::i;:::-;35366:4;35372:7;35381:5;35315:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35311:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35578:1;35561:6;:13;:18;35557:272;;;35604:60;;;;;;;;;;:::i;:::-;;;;;;;;35557:272;35779:6;35773:13;35764:6;35760:2;35756:15;35749:38;35311:533;35448:45;;;35438:55;;;:6;:55;;;;35431:62;;;;;35275:624;35883:4;35876:11;;35103:803;;;;;;;:::o;36478:126::-;;;;:::o;41516:164::-;41620:10;:17;;;;41593:15;:24;41609:7;41593:24;;;;;;;;;;;:44;;;;41648:10;41664:7;41648:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41516:164;:::o;42307:988::-;42573:22;42623:1;42598:22;42615:4;42598:16;:22::i;:::-;:26;;;;:::i;:::-;42573:51;;42635:18;42656:17;:26;42674:7;42656:26;;;;;;;;;;;;42635:47;;42803:14;42789:10;:28;42785:328;;42834:19;42856:12;:18;42869:4;42856:18;;;;;;;;;;;;;;;:34;42875:14;42856:34;;;;;;;;;;;;42834:56;;42940:11;42907:12;:18;42920:4;42907:18;;;;;;;;;;;;;;;:30;42926:10;42907:30;;;;;;;;;;;:44;;;;43057:10;43024:17;:30;43042:11;43024:30;;;;;;;;;;;:43;;;;42819:294;42785:328;43209:17;:26;43227:7;43209:26;;;;;;;;;;;43202:33;;;43253:12;:18;43266:4;43253:18;;;;;;;;;;;;;;;:34;43272:14;43253:34;;;;;;;;;;;43246:41;;;42388:907;;42307:988;;:::o;43590:1079::-;43843:22;43888:1;43868:10;:17;;;;:21;;;;:::i;:::-;43843:46;;43900:18;43921:15;:24;43937:7;43921:24;;;;;;;;;;;;43900:45;;44272:19;44294:10;44305:14;44294:26;;;;;;;;:::i;:::-;;;;;;;;;;44272:48;;44358:11;44333:10;44344;44333:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;44469:10;44438:15;:28;44454:11;44438:28;;;;;;;;;;;:41;;;;44610:15;:24;44626:7;44610:24;;;;;;;;;;;44603:31;;;44645:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;43661:1008;;;43590:1079;:::o;41094:221::-;41179:14;41196:20;41213:2;41196:16;:20::i;:::-;41179:37;;41254:7;41227:12;:16;41240:2;41227:16;;;;;;;;;;;;;;;:24;41244:6;41227:24;;;;;;;;;;;:34;;;;41301:6;41272:17;:26;41290:7;41272:26;;;;;;;;;;;:35;;;;41168:147;41094:221;;:::o;32360:382::-;32454:1;32440:16;;:2;:16;;;;32432:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;32513:16;32521:7;32513;:16::i;:::-;32512:17;32504:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32575:45;32604:1;32608:2;32612:7;32575:20;:45::i;:::-;32650:1;32633:9;:13;32643:2;32633:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32681:2;32662:7;:16;32670:7;32662:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32726:7;32722:2;32701:33;;32718:1;32701:33;;;;;;;;;;;;32360:382;;:::o;13012:387::-;13072:4;13280:12;13347:7;13335:20;13327:28;;13390:1;13383:4;:8;13376:15;;;13012:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;280:79;;:::i;:::-;249:2;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:2;;;698:79;;:::i;:::-;667:2;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;893:87;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;1035:84;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1176:86;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1330:79;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:2;;1540:79;;:::i;:::-;1499:2;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;;;;;:::o;1772:165::-;1831:5;1869:6;1856:20;1847:29;;1885:46;1925:5;1885:46;:::i;:::-;1837:100;;;;:::o;1957:340::-;2013:5;2062:3;2055:4;2047:6;2043:17;2039:27;2029:2;;2070:79;;:::i;:::-;2029:2;2187:6;2174:20;2212:79;2287:3;2279:6;2272:4;2264:6;2260:17;2212:79;:::i;:::-;2203:88;;2019:278;;;;;:::o;2303:139::-;2349:5;2387:6;2374:20;2365:29;;2403:33;2430:5;2403:33;:::i;:::-;2355:87;;;;:::o;2448:329::-;2507:6;2556:2;2544:9;2535:7;2531:23;2527:32;2524:2;;;2562:79;;:::i;:::-;2524:2;2682:1;2707:53;2752:7;2743:6;2732:9;2728:22;2707:53;:::i;:::-;2697:63;;2653:117;2514:263;;;;:::o;2783:474::-;2851:6;2859;2908:2;2896:9;2887:7;2883:23;2879:32;2876:2;;;2914:79;;:::i;:::-;2876:2;3034:1;3059:53;3104:7;3095:6;3084:9;3080:22;3059:53;:::i;:::-;3049:63;;3005:117;3161:2;3187:53;3232:7;3223:6;3212:9;3208:22;3187:53;:::i;:::-;3177:63;;3132:118;2866:391;;;;;:::o;3263:619::-;3340:6;3348;3356;3405:2;3393:9;3384:7;3380:23;3376:32;3373:2;;;3411:79;;:::i;:::-;3373:2;3531:1;3556:53;3601:7;3592:6;3581:9;3577:22;3556:53;:::i;:::-;3546:63;;3502:117;3658:2;3684:53;3729:7;3720:6;3709:9;3705:22;3684:53;:::i;:::-;3674:63;;3629:118;3786:2;3812:53;3857:7;3848:6;3837:9;3833:22;3812:53;:::i;:::-;3802:63;;3757:118;3363:519;;;;;:::o;3888:943::-;3983:6;3991;3999;4007;4056:3;4044:9;4035:7;4031:23;4027:33;4024:2;;;4063:79;;:::i;:::-;4024:2;4183:1;4208:53;4253:7;4244:6;4233:9;4229:22;4208:53;:::i;:::-;4198:63;;4154:117;4310:2;4336:53;4381:7;4372:6;4361:9;4357:22;4336:53;:::i;:::-;4326:63;;4281:118;4438:2;4464:53;4509:7;4500:6;4489:9;4485:22;4464:53;:::i;:::-;4454:63;;4409:118;4594:2;4583:9;4579:18;4566:32;4625:18;4617:6;4614:30;4611:2;;;4647:79;;:::i;:::-;4611:2;4752:62;4806:7;4797:6;4786:9;4782:22;4752:62;:::i;:::-;4742:72;;4537:287;4014:817;;;;;;;:::o;4837:468::-;4902:6;4910;4959:2;4947:9;4938:7;4934:23;4930:32;4927:2;;;4965:79;;:::i;:::-;4927:2;5085:1;5110:53;5155:7;5146:6;5135:9;5131:22;5110:53;:::i;:::-;5100:63;;5056:117;5212:2;5238:50;5280:7;5271:6;5260:9;5256:22;5238:50;:::i;:::-;5228:60;;5183:115;4917:388;;;;;:::o;5311:474::-;5379:6;5387;5436:2;5424:9;5415:7;5411:23;5407:32;5404:2;;;5442:79;;:::i;:::-;5404:2;5562:1;5587:53;5632:7;5623:6;5612:9;5608:22;5587:53;:::i;:::-;5577:63;;5533:117;5689:2;5715:53;5760:7;5751:6;5740:9;5736:22;5715:53;:::i;:::-;5705:63;;5660:118;5394:391;;;;;:::o;5791:323::-;5847:6;5896:2;5884:9;5875:7;5871:23;5867:32;5864:2;;;5902:79;;:::i;:::-;5864:2;6022:1;6047:50;6089:7;6080:6;6069:9;6065:22;6047:50;:::i;:::-;6037:60;;5993:114;5854:260;;;;:::o;6120:327::-;6178:6;6227:2;6215:9;6206:7;6202:23;6198:32;6195:2;;;6233:79;;:::i;:::-;6195:2;6353:1;6378:52;6422:7;6413:6;6402:9;6398:22;6378:52;:::i;:::-;6368:62;;6324:116;6185:262;;;;:::o;6453:349::-;6522:6;6571:2;6559:9;6550:7;6546:23;6542:32;6539:2;;;6577:79;;:::i;:::-;6539:2;6697:1;6722:63;6777:7;6768:6;6757:9;6753:22;6722:63;:::i;:::-;6712:73;;6668:127;6529:273;;;;:::o;6808:329::-;6867:6;6916:2;6904:9;6895:7;6891:23;6887:32;6884:2;;;6922:79;;:::i;:::-;6884:2;7042:1;7067:53;7112:7;7103:6;7092:9;7088:22;7067:53;:::i;:::-;7057:63;;7013:117;6874:263;;;;:::o;7143:500::-;7224:6;7232;7281:2;7269:9;7260:7;7256:23;7252:32;7249:2;;;7287:79;;:::i;:::-;7249:2;7407:1;7432:53;7477:7;7468:6;7457:9;7453:22;7432:53;:::i;:::-;7422:63;;7378:117;7534:2;7560:66;7618:7;7609:6;7598:9;7594:22;7560:66;:::i;:::-;7550:76;;7505:131;7239:404;;;;;:::o;7649:654::-;7727:6;7735;7784:2;7772:9;7763:7;7759:23;7755:32;7752:2;;;7790:79;;:::i;:::-;7752:2;7910:1;7935:53;7980:7;7971:6;7960:9;7956:22;7935:53;:::i;:::-;7925:63;;7881:117;8065:2;8054:9;8050:18;8037:32;8096:18;8088:6;8085:30;8082:2;;;8118:79;;:::i;:::-;8082:2;8223:63;8278:7;8269:6;8258:9;8254:22;8223:63;:::i;:::-;8213:73;;8008:288;7742:561;;;;;:::o;8309:1675::-;8450:6;8458;8466;8474;8482;8490;8498;8506;8514;8563:3;8551:9;8542:7;8538:23;8534:33;8531:2;;;8570:79;;:::i;:::-;8531:2;8690:1;8715:53;8760:7;8751:6;8740:9;8736:22;8715:53;:::i;:::-;8705:63;;8661:117;8817:2;8843:53;8888:7;8879:6;8868:9;8864:22;8843:53;:::i;:::-;8833:63;;8788:118;8945:2;8971:53;9016:7;9007:6;8996:9;8992:22;8971:53;:::i;:::-;8961:63;;8916:118;9073:2;9099:53;9144:7;9135:6;9124:9;9120:22;9099:53;:::i;:::-;9089:63;;9044:118;9201:3;9228:53;9273:7;9264:6;9253:9;9249:22;9228:53;:::i;:::-;9218:63;;9172:119;9330:3;9357:53;9402:7;9393:6;9382:9;9378:22;9357:53;:::i;:::-;9347:63;;9301:119;9459:3;9486:53;9531:7;9522:6;9511:9;9507:22;9486:53;:::i;:::-;9476:63;;9430:119;9588:3;9615:53;9660:7;9651:6;9640:9;9636:22;9615:53;:::i;:::-;9605:63;;9559:119;9745:3;9734:9;9730:19;9717:33;9777:18;9769:6;9766:30;9763:2;;;9799:79;;:::i;:::-;9763:2;9904:63;9959:7;9950:6;9939:9;9935:22;9904:63;:::i;:::-;9894:73;;9688:289;8521:1463;;;;;;;;;;;:::o;9990:118::-;10077:24;10095:5;10077:24;:::i;:::-;10072:3;10065:37;10055:53;;:::o;10114:99::-;10185:21;10200:5;10185:21;:::i;:::-;10180:3;10173:34;10163:50;;:::o;10219:109::-;10300:21;10315:5;10300:21;:::i;:::-;10295:3;10288:34;10278:50;;:::o;10334:360::-;10420:3;10448:38;10480:5;10448:38;:::i;:::-;10502:70;10565:6;10560:3;10502:70;:::i;:::-;10495:77;;10581:52;10626:6;10621:3;10614:4;10607:5;10603:16;10581:52;:::i;:::-;10658:29;10680:6;10658:29;:::i;:::-;10653:3;10649:39;10642:46;;10424:270;;;;;:::o;10700:143::-;10788:48;10830:5;10788:48;:::i;:::-;10783:3;10776:61;10766:77;;:::o;10849:344::-;10927:3;10955:39;10988:5;10955:39;:::i;:::-;11010:61;11064:6;11059:3;11010:61;:::i;:::-;11003:68;;11080:52;11125:6;11120:3;11113:4;11106:5;11102:16;11080:52;:::i;:::-;11157:29;11179:6;11157:29;:::i;:::-;11152:3;11148:39;11141:46;;10931:262;;;;;:::o;11199:364::-;11287:3;11315:39;11348:5;11315:39;:::i;:::-;11370:71;11434:6;11429:3;11370:71;:::i;:::-;11363:78;;11450:52;11495:6;11490:3;11483:4;11476:5;11472:16;11450:52;:::i;:::-;11527:29;11549:6;11527:29;:::i;:::-;11522:3;11518:39;11511:46;;11291:272;;;;;:::o;11569:377::-;11675:3;11703:39;11736:5;11703:39;:::i;:::-;11758:89;11840:6;11835:3;11758:89;:::i;:::-;11751:96;;11856:52;11901:6;11896:3;11889:4;11882:5;11878:16;11856:52;:::i;:::-;11933:6;11928:3;11924:16;11917:23;;11679:267;;;;;:::o;11952:366::-;12094:3;12115:67;12179:2;12174:3;12115:67;:::i;:::-;12108:74;;12191:93;12280:3;12191:93;:::i;:::-;12309:2;12304:3;12300:12;12293:19;;12098:220;;;:::o;12324:366::-;12466:3;12487:67;12551:2;12546:3;12487:67;:::i;:::-;12480:74;;12563:93;12652:3;12563:93;:::i;:::-;12681:2;12676:3;12672:12;12665:19;;12470:220;;;:::o;12696:366::-;12838:3;12859:67;12923:2;12918:3;12859:67;:::i;:::-;12852:74;;12935:93;13024:3;12935:93;:::i;:::-;13053:2;13048:3;13044:12;13037:19;;12842:220;;;:::o;13068:366::-;13210:3;13231:67;13295:2;13290:3;13231:67;:::i;:::-;13224:74;;13307:93;13396:3;13307:93;:::i;:::-;13425:2;13420:3;13416:12;13409:19;;13214:220;;;:::o;13440:366::-;13582:3;13603:67;13667:2;13662:3;13603:67;:::i;:::-;13596:74;;13679:93;13768:3;13679:93;:::i;:::-;13797:2;13792:3;13788:12;13781:19;;13586:220;;;:::o;13812:366::-;13954:3;13975:67;14039:2;14034:3;13975:67;:::i;:::-;13968:74;;14051:93;14140:3;14051:93;:::i;:::-;14169:2;14164:3;14160:12;14153:19;;13958:220;;;:::o;14184:366::-;14326:3;14347:67;14411:2;14406:3;14347:67;:::i;:::-;14340:74;;14423:93;14512:3;14423:93;:::i;:::-;14541:2;14536:3;14532:12;14525:19;;14330:220;;;:::o;14556:366::-;14698:3;14719:67;14783:2;14778:3;14719:67;:::i;:::-;14712:74;;14795:93;14884:3;14795:93;:::i;:::-;14913:2;14908:3;14904:12;14897:19;;14702:220;;;:::o;14928:366::-;15070:3;15091:67;15155:2;15150:3;15091:67;:::i;:::-;15084:74;;15167:93;15256:3;15167:93;:::i;:::-;15285:2;15280:3;15276:12;15269:19;;15074:220;;;:::o;15300:366::-;15442:3;15463:67;15527:2;15522:3;15463:67;:::i;:::-;15456:74;;15539:93;15628:3;15539:93;:::i;:::-;15657:2;15652:3;15648:12;15641:19;;15446:220;;;:::o;15672:366::-;15814:3;15835:67;15899:2;15894:3;15835:67;:::i;:::-;15828:74;;15911:93;16000:3;15911:93;:::i;:::-;16029:2;16024:3;16020:12;16013:19;;15818:220;;;:::o;16044:366::-;16186:3;16207:67;16271:2;16266:3;16207:67;:::i;:::-;16200:74;;16283:93;16372:3;16283:93;:::i;:::-;16401:2;16396:3;16392:12;16385:19;;16190:220;;;:::o;16416:366::-;16558:3;16579:67;16643:2;16638:3;16579:67;:::i;:::-;16572:74;;16655:93;16744:3;16655:93;:::i;:::-;16773:2;16768:3;16764:12;16757:19;;16562:220;;;:::o;16788:366::-;16930:3;16951:67;17015:2;17010:3;16951:67;:::i;:::-;16944:74;;17027:93;17116:3;17027:93;:::i;:::-;17145:2;17140:3;17136:12;17129:19;;16934:220;;;:::o;17160:366::-;17302:3;17323:67;17387:2;17382:3;17323:67;:::i;:::-;17316:74;;17399:93;17488:3;17399:93;:::i;:::-;17517:2;17512:3;17508:12;17501:19;;17306:220;;;:::o;17532:366::-;17674:3;17695:67;17759:2;17754:3;17695:67;:::i;:::-;17688:74;;17771:93;17860:3;17771:93;:::i;:::-;17889:2;17884:3;17880:12;17873:19;;17678:220;;;:::o;17904:366::-;18046:3;18067:67;18131:2;18126:3;18067:67;:::i;:::-;18060:74;;18143:93;18232:3;18143:93;:::i;:::-;18261:2;18256:3;18252:12;18245:19;;18050:220;;;:::o;18276:366::-;18418:3;18439:67;18503:2;18498:3;18439:67;:::i;:::-;18432:74;;18515:93;18604:3;18515:93;:::i;:::-;18633:2;18628:3;18624:12;18617:19;;18422:220;;;:::o;18648:366::-;18790:3;18811:67;18875:2;18870:3;18811:67;:::i;:::-;18804:74;;18887:93;18976:3;18887:93;:::i;:::-;19005:2;19000:3;18996:12;18989:19;;18794:220;;;:::o;19020:366::-;19162:3;19183:67;19247:2;19242:3;19183:67;:::i;:::-;19176:74;;19259:93;19348:3;19259:93;:::i;:::-;19377:2;19372:3;19368:12;19361:19;;19166:220;;;:::o;19392:366::-;19534:3;19555:67;19619:2;19614:3;19555:67;:::i;:::-;19548:74;;19631:93;19720:3;19631:93;:::i;:::-;19749:2;19744:3;19740:12;19733:19;;19538:220;;;:::o;19764:366::-;19906:3;19927:67;19991:2;19986:3;19927:67;:::i;:::-;19920:74;;20003:93;20092:3;20003:93;:::i;:::-;20121:2;20116:3;20112:12;20105:19;;19910:220;;;:::o;20136:366::-;20278:3;20299:67;20363:2;20358:3;20299:67;:::i;:::-;20292:74;;20375:93;20464:3;20375:93;:::i;:::-;20493:2;20488:3;20484:12;20477:19;;20282:220;;;:::o;20508:366::-;20650:3;20671:67;20735:2;20730:3;20671:67;:::i;:::-;20664:74;;20747:93;20836:3;20747:93;:::i;:::-;20865:2;20860:3;20856:12;20849:19;;20654:220;;;:::o;20880:366::-;21022:3;21043:67;21107:2;21102:3;21043:67;:::i;:::-;21036:74;;21119:93;21208:3;21119:93;:::i;:::-;21237:2;21232:3;21228:12;21221:19;;21026:220;;;:::o;21252:366::-;21394:3;21415:67;21479:2;21474:3;21415:67;:::i;:::-;21408:74;;21491:93;21580:3;21491:93;:::i;:::-;21609:2;21604:3;21600:12;21593:19;;21398:220;;;:::o;21624:366::-;21766:3;21787:67;21851:2;21846:3;21787:67;:::i;:::-;21780:74;;21863:93;21952:3;21863:93;:::i;:::-;21981:2;21976:3;21972:12;21965:19;;21770:220;;;:::o;21996:366::-;22138:3;22159:67;22223:2;22218:3;22159:67;:::i;:::-;22152:74;;22235:93;22324:3;22235:93;:::i;:::-;22353:2;22348:3;22344:12;22337:19;;22142:220;;;:::o;22432:2126::-;22545:3;22581:6;22576:3;22572:16;22671:4;22664:5;22660:16;22654:23;22690:63;22747:4;22742:3;22738:14;22724:12;22690:63;:::i;:::-;22598:165;22855:4;22848:5;22844:16;22838:23;22874:63;22931:4;22926:3;22922:14;22908:12;22874:63;:::i;:::-;22773:174;23047:4;23040:5;23036:16;23030:23;23066:63;23123:4;23118:3;23114:14;23100:12;23066:63;:::i;:::-;22957:182;23238:4;23231:5;23227:16;23221:23;23257:63;23314:4;23309:3;23305:14;23291:12;23257:63;:::i;:::-;23149:181;23430:4;23423:5;23419:16;23413:23;23449:63;23506:4;23501:3;23497:14;23483:12;23449:63;:::i;:::-;23340:182;23630:4;23623:5;23619:16;23613:23;23649:63;23706:4;23701:3;23697:14;23683:12;23649:63;:::i;:::-;23532:190;23829:4;23822:5;23818:16;23812:23;23848:63;23905:4;23900:3;23896:14;23882:12;23848:63;:::i;:::-;23732:189;24018:4;24011:5;24007:16;24001:23;24037:63;24094:4;24089:3;24085:14;24071:12;24037:63;:::i;:::-;23931:179;24191:6;24184:5;24180:18;24174:25;24248:3;24242:4;24238:14;24229:6;24224:3;24220:16;24213:40;24274:73;24342:4;24328:12;24274:73;:::i;:::-;24266:81;;24120:238;24441:6;24434:5;24430:18;24424:25;24462:59;24513:6;24508:3;24504:16;24490:12;24462:59;:::i;:::-;24368:163;24548:4;24541:11;;22550:2008;;;;;:::o;24628:706::-;24769:4;24764:3;24760:14;24864:4;24857:5;24853:16;24847:23;24883:63;24940:4;24935:3;24931:14;24917:12;24883:63;:::i;:::-;24784:172;25045:4;25038:5;25034:16;25028:23;25064:63;25121:4;25116:3;25112:14;25098:12;25064:63;:::i;:::-;24966:171;25224:4;25217:5;25213:16;25207:23;25243:74;25311:4;25306:3;25302:14;25288:12;25243:74;:::i;:::-;25147:180;24738:596;;;:::o;25340:108::-;25417:24;25435:5;25417:24;:::i;:::-;25412:3;25405:37;25395:53;;:::o;25454:118::-;25541:24;25559:5;25541:24;:::i;:::-;25536:3;25529:37;25519:53;;:::o;25578:435::-;25758:3;25780:95;25871:3;25862:6;25780:95;:::i;:::-;25773:102;;25892:95;25983:3;25974:6;25892:95;:::i;:::-;25885:102;;26004:3;25997:10;;25762:251;;;;;:::o;26019:222::-;26112:4;26150:2;26139:9;26135:18;26127:26;;26163:71;26231:1;26220:9;26216:17;26207:6;26163:71;:::i;:::-;26117:124;;;;:::o;26247:640::-;26442:4;26480:3;26469:9;26465:19;26457:27;;26494:71;26562:1;26551:9;26547:17;26538:6;26494:71;:::i;:::-;26575:72;26643:2;26632:9;26628:18;26619:6;26575:72;:::i;:::-;26657;26725:2;26714:9;26710:18;26701:6;26657:72;:::i;:::-;26776:9;26770:4;26766:20;26761:2;26750:9;26746:18;26739:48;26804:76;26875:4;26866:6;26804:76;:::i;:::-;26796:84;;26447:440;;;;;;;:::o;26893:210::-;26980:4;27018:2;27007:9;27003:18;26995:26;;27031:65;27093:1;27082:9;27078:17;27069:6;27031:65;:::i;:::-;26985:118;;;;:::o;27109:313::-;27222:4;27260:2;27249:9;27245:18;27237:26;;27309:9;27303:4;27299:20;27295:1;27284:9;27280:17;27273:47;27337:78;27410:4;27401:6;27337:78;:::i;:::-;27329:86;;27227:195;;;;:::o;27428:419::-;27594:4;27632:2;27621:9;27617:18;27609:26;;27681:9;27675:4;27671:20;27667:1;27656:9;27652:17;27645:47;27709:131;27835:4;27709:131;:::i;:::-;27701:139;;27599:248;;;:::o;27853:419::-;28019:4;28057:2;28046:9;28042:18;28034:26;;28106:9;28100:4;28096:20;28092:1;28081:9;28077:17;28070:47;28134:131;28260:4;28134:131;:::i;:::-;28126:139;;28024:248;;;:::o;28278:419::-;28444:4;28482:2;28471:9;28467:18;28459:26;;28531:9;28525:4;28521:20;28517:1;28506:9;28502:17;28495:47;28559:131;28685:4;28559:131;:::i;:::-;28551:139;;28449:248;;;:::o;28703:419::-;28869:4;28907:2;28896:9;28892:18;28884:26;;28956:9;28950:4;28946:20;28942:1;28931:9;28927:17;28920:47;28984:131;29110:4;28984:131;:::i;:::-;28976:139;;28874:248;;;:::o;29128:419::-;29294:4;29332:2;29321:9;29317:18;29309:26;;29381:9;29375:4;29371:20;29367:1;29356:9;29352:17;29345:47;29409:131;29535:4;29409:131;:::i;:::-;29401:139;;29299:248;;;:::o;29553:419::-;29719:4;29757:2;29746:9;29742:18;29734:26;;29806:9;29800:4;29796:20;29792:1;29781:9;29777:17;29770:47;29834:131;29960:4;29834:131;:::i;:::-;29826:139;;29724:248;;;:::o;29978:419::-;30144:4;30182:2;30171:9;30167:18;30159:26;;30231:9;30225:4;30221:20;30217:1;30206:9;30202:17;30195:47;30259:131;30385:4;30259:131;:::i;:::-;30251:139;;30149:248;;;:::o;30403:419::-;30569:4;30607:2;30596:9;30592:18;30584:26;;30656:9;30650:4;30646:20;30642:1;30631:9;30627:17;30620:47;30684:131;30810:4;30684:131;:::i;:::-;30676:139;;30574:248;;;:::o;30828:419::-;30994:4;31032:2;31021:9;31017:18;31009:26;;31081:9;31075:4;31071:20;31067:1;31056:9;31052:17;31045:47;31109:131;31235:4;31109:131;:::i;:::-;31101:139;;30999:248;;;:::o;31253:419::-;31419:4;31457:2;31446:9;31442:18;31434:26;;31506:9;31500:4;31496:20;31492:1;31481:9;31477:17;31470:47;31534:131;31660:4;31534:131;:::i;:::-;31526:139;;31424:248;;;:::o;31678:419::-;31844:4;31882:2;31871:9;31867:18;31859:26;;31931:9;31925:4;31921:20;31917:1;31906:9;31902:17;31895:47;31959:131;32085:4;31959:131;:::i;:::-;31951:139;;31849:248;;;:::o;32103:419::-;32269:4;32307:2;32296:9;32292:18;32284:26;;32356:9;32350:4;32346:20;32342:1;32331:9;32327:17;32320:47;32384:131;32510:4;32384:131;:::i;:::-;32376:139;;32274:248;;;:::o;32528:419::-;32694:4;32732:2;32721:9;32717:18;32709:26;;32781:9;32775:4;32771:20;32767:1;32756:9;32752:17;32745:47;32809:131;32935:4;32809:131;:::i;:::-;32801:139;;32699:248;;;:::o;32953:419::-;33119:4;33157:2;33146:9;33142:18;33134:26;;33206:9;33200:4;33196:20;33192:1;33181:9;33177:17;33170:47;33234:131;33360:4;33234:131;:::i;:::-;33226:139;;33124:248;;;:::o;33378:419::-;33544:4;33582:2;33571:9;33567:18;33559:26;;33631:9;33625:4;33621:20;33617:1;33606:9;33602:17;33595:47;33659:131;33785:4;33659:131;:::i;:::-;33651:139;;33549:248;;;:::o;33803:419::-;33969:4;34007:2;33996:9;33992:18;33984:26;;34056:9;34050:4;34046:20;34042:1;34031:9;34027:17;34020:47;34084:131;34210:4;34084:131;:::i;:::-;34076:139;;33974:248;;;:::o;34228:419::-;34394:4;34432:2;34421:9;34417:18;34409:26;;34481:9;34475:4;34471:20;34467:1;34456:9;34452:17;34445:47;34509:131;34635:4;34509:131;:::i;:::-;34501:139;;34399:248;;;:::o;34653:419::-;34819:4;34857:2;34846:9;34842:18;34834:26;;34906:9;34900:4;34896:20;34892:1;34881:9;34877:17;34870:47;34934:131;35060:4;34934:131;:::i;:::-;34926:139;;34824:248;;;:::o;35078:419::-;35244:4;35282:2;35271:9;35267:18;35259:26;;35331:9;35325:4;35321:20;35317:1;35306:9;35302:17;35295:47;35359:131;35485:4;35359:131;:::i;:::-;35351:139;;35249:248;;;:::o;35503:419::-;35669:4;35707:2;35696:9;35692:18;35684:26;;35756:9;35750:4;35746:20;35742:1;35731:9;35727:17;35720:47;35784:131;35910:4;35784:131;:::i;:::-;35776:139;;35674:248;;;:::o;35928:419::-;36094:4;36132:2;36121:9;36117:18;36109:26;;36181:9;36175:4;36171:20;36167:1;36156:9;36152:17;36145:47;36209:131;36335:4;36209:131;:::i;:::-;36201:139;;36099:248;;;:::o;36353:419::-;36519:4;36557:2;36546:9;36542:18;36534:26;;36606:9;36600:4;36596:20;36592:1;36581:9;36577:17;36570:47;36634:131;36760:4;36634:131;:::i;:::-;36626:139;;36524:248;;;:::o;36778:419::-;36944:4;36982:2;36971:9;36967:18;36959:26;;37031:9;37025:4;37021:20;37017:1;37006:9;37002:17;36995:47;37059:131;37185:4;37059:131;:::i;:::-;37051:139;;36949:248;;;:::o;37203:419::-;37369:4;37407:2;37396:9;37392:18;37384:26;;37456:9;37450:4;37446:20;37442:1;37431:9;37427:17;37420:47;37484:131;37610:4;37484:131;:::i;:::-;37476:139;;37374:248;;;:::o;37628:419::-;37794:4;37832:2;37821:9;37817:18;37809:26;;37881:9;37875:4;37871:20;37867:1;37856:9;37852:17;37845:47;37909:131;38035:4;37909:131;:::i;:::-;37901:139;;37799:248;;;:::o;38053:419::-;38219:4;38257:2;38246:9;38242:18;38234:26;;38306:9;38300:4;38296:20;38292:1;38281:9;38277:17;38270:47;38334:131;38460:4;38334:131;:::i;:::-;38326:139;;38224:248;;;:::o;38478:419::-;38644:4;38682:2;38671:9;38667:18;38659:26;;38731:9;38725:4;38721:20;38717:1;38706:9;38702:17;38695:47;38759:131;38885:4;38759:131;:::i;:::-;38751:139;;38649:248;;;:::o;38903:419::-;39069:4;39107:2;39096:9;39092:18;39084:26;;39156:9;39150:4;39146:20;39142:1;39131:9;39127:17;39120:47;39184:131;39310:4;39184:131;:::i;:::-;39176:139;;39074:248;;;:::o;39328:361::-;39465:4;39503:2;39492:9;39488:18;39480:26;;39552:9;39546:4;39542:20;39538:1;39527:9;39523:17;39516:47;39580:102;39677:4;39668:6;39580:102;:::i;:::-;39572:110;;39470:219;;;;:::o;39695:310::-;39832:4;39870:2;39859:9;39855:18;39847:26;;39883:115;39995:1;39984:9;39980:17;39971:6;39883:115;:::i;:::-;39837:168;;;;:::o;40011:222::-;40104:4;40142:2;40131:9;40127:18;40119:26;;40155:71;40223:1;40212:9;40208:17;40199:6;40155:71;:::i;:::-;40109:124;;;;:::o;40239:129::-;40273:6;40300:20;;:::i;:::-;40290:30;;40329:33;40357:4;40349:6;40329:33;:::i;:::-;40280:88;;;:::o;40374:75::-;40407:6;40440:2;40434:9;40424:19;;40414:35;:::o;40455:307::-;40516:4;40606:18;40598:6;40595:30;40592:2;;;40628:18;;:::i;:::-;40592:2;40666:29;40688:6;40666:29;:::i;:::-;40658:37;;40750:4;40744;40740:15;40732:23;;40521:241;;;:::o;40768:308::-;40830:4;40920:18;40912:6;40909:30;40906:2;;;40942:18;;:::i;:::-;40906:2;40980:29;41002:6;40980:29;:::i;:::-;40972:37;;41064:4;41058;41054:15;41046:23;;40835:241;;;:::o;41082:98::-;41133:6;41167:5;41161:12;41151:22;;41140:40;;;:::o;41186:99::-;41238:6;41272:5;41266:12;41256:22;;41245:40;;;:::o;41291:168::-;41374:11;41408:6;41403:3;41396:19;41448:4;41443:3;41439:14;41424:29;;41386:73;;;;:::o;41465:159::-;41539:11;41573:6;41568:3;41561:19;41613:4;41608:3;41604:14;41589:29;;41551:73;;;;:::o;41630:169::-;41714:11;41748:6;41743:3;41736:19;41788:4;41783:3;41779:14;41764:29;;41726:73;;;;:::o;41805:148::-;41907:11;41944:3;41929:18;;41919:34;;;;:::o;41959:305::-;41999:3;42018:20;42036:1;42018:20;:::i;:::-;42013:25;;42052:20;42070:1;42052:20;:::i;:::-;42047:25;;42206:1;42138:66;42134:74;42131:1;42128:81;42125:2;;;42212:18;;:::i;:::-;42125:2;42256:1;42253;42249:9;42242:16;;42003:261;;;;:::o;42270:185::-;42310:1;42327:20;42345:1;42327:20;:::i;:::-;42322:25;;42361:20;42379:1;42361:20;:::i;:::-;42356:25;;42400:1;42390:2;;42405:18;;:::i;:::-;42390:2;42447:1;42444;42440:9;42435:14;;42312:143;;;;:::o;42461:191::-;42501:4;42521:20;42539:1;42521:20;:::i;:::-;42516:25;;42555:20;42573:1;42555:20;:::i;:::-;42550:25;;42594:1;42591;42588:8;42585:2;;;42599:18;;:::i;:::-;42585:2;42644:1;42641;42637:9;42629:17;;42506:146;;;;:::o;42658:96::-;42695:7;42724:24;42742:5;42724:24;:::i;:::-;42713:35;;42703:51;;;:::o;42760:90::-;42794:7;42837:5;42830:13;42823:21;42812:32;;42802:48;;;:::o;42856:149::-;42892:7;42932:66;42925:5;42921:78;42910:89;;42900:105;;;:::o;43011:137::-;43061:7;43090:5;43079:16;;43096:46;43136:5;43096:46;:::i;:::-;43069:79;;;:::o;43154:126::-;43191:7;43231:42;43224:5;43220:54;43209:65;;43199:81;;;:::o;43286:77::-;43323:7;43352:5;43341:16;;43331:32;;;:::o;43369:137::-;43430:9;43463:37;43494:5;43463:37;:::i;:::-;43450:50;;43440:66;;;:::o;43512:154::-;43596:6;43591:3;43586;43573:30;43658:1;43649:6;43644:3;43640:16;43633:27;43563:103;;;:::o;43672:307::-;43740:1;43750:113;43764:6;43761:1;43758:13;43750:113;;;43849:1;43844:3;43840:11;43834:18;43830:1;43825:3;43821:11;43814:39;43786:2;43783:1;43779:10;43774:15;;43750:113;;;43881:6;43878:1;43875:13;43872:2;;;43961:1;43952:6;43947:3;43943:16;43936:27;43872:2;43721:258;;;;:::o;43985:320::-;44029:6;44066:1;44060:4;44056:12;44046:22;;44113:1;44107:4;44103:12;44134:18;44124:2;;44190:4;44182:6;44178:17;44168:27;;44124:2;44252;44244:6;44241:14;44221:18;44218:38;44215:2;;;44271:18;;:::i;:::-;44215:2;44036:269;;;;:::o;44311:281::-;44394:27;44416:4;44394:27;:::i;:::-;44386:6;44382:40;44524:6;44512:10;44509:22;44488:18;44476:10;44473:34;44470:62;44467:2;;;44535:18;;:::i;:::-;44467:2;44575:10;44571:2;44564:22;44354:238;;;:::o;44598:233::-;44637:3;44660:24;44678:5;44660:24;:::i;:::-;44651:33;;44706:66;44699:5;44696:77;44693:2;;;44776:18;;:::i;:::-;44693:2;44823:1;44816:5;44812:13;44805:20;;44641:190;;;:::o;44837:176::-;44869:1;44886:20;44904:1;44886:20;:::i;:::-;44881:25;;44920:20;44938:1;44920:20;:::i;:::-;44915:25;;44959:1;44949:2;;44964:18;;:::i;:::-;44949:2;45005:1;45002;44998:9;44993:14;;44871:142;;;;:::o;45019:180::-;45067:77;45064:1;45057:88;45164:4;45161:1;45154:15;45188:4;45185:1;45178:15;45205:180;45253:77;45250:1;45243:88;45350:4;45347:1;45340:15;45374:4;45371:1;45364:15;45391:180;45439:77;45436:1;45429:88;45536:4;45533:1;45526:15;45560:4;45557:1;45550:15;45577:180;45625:77;45622:1;45615:88;45722:4;45719:1;45712:15;45746:4;45743:1;45736:15;45763:180;45811:77;45808:1;45801:88;45908:4;45905:1;45898:15;45932:4;45929:1;45922:15;45949:180;45997:77;45994:1;45987:88;46094:4;46091:1;46084:15;46118:4;46115:1;46108:15;46135:180;46183:77;46180:1;46173:88;46280:4;46277:1;46270:15;46304:4;46301:1;46294:15;46321:117;46430:1;46427;46420:12;46444:117;46553:1;46550;46543:12;46567:117;46676:1;46673;46666:12;46690:117;46799:1;46796;46789:12;46813:102;46854:6;46905:2;46901:7;46896:2;46889:5;46885:14;46881:28;46871:38;;46861:54;;;:::o;46921:169::-;47061:21;47057:1;47049:6;47045:14;47038:45;47027:63;:::o;47096:230::-;47236:34;47232:1;47224:6;47220:14;47213:58;47305:13;47300:2;47292:6;47288:15;47281:38;47202:124;:::o;47332:237::-;47472:34;47468:1;47460:6;47456:14;47449:58;47541:20;47536:2;47528:6;47524:15;47517:45;47438:131;:::o;47575:225::-;47715:34;47711:1;47703:6;47699:14;47692:58;47784:8;47779:2;47771:6;47767:15;47760:33;47681:119;:::o;47806:167::-;47946:19;47942:1;47934:6;47930:14;47923:43;47912:61;:::o;47979:178::-;48119:30;48115:1;48107:6;48103:14;48096:54;48085:72;:::o;48163:223::-;48303:34;48299:1;48291:6;48287:14;48280:58;48372:6;48367:2;48359:6;48355:15;48348:31;48269:117;:::o;48392:175::-;48532:27;48528:1;48520:6;48516:14;48509:51;48498:69;:::o;48573:231::-;48713:34;48709:1;48701:6;48697:14;48690:58;48782:14;48777:2;48769:6;48765:15;48758:39;48679:125;:::o;48810:243::-;48950:34;48946:1;48938:6;48934:14;48927:58;49019:26;49014:2;49006:6;49002:15;48995:51;48916:137;:::o;49059:163::-;49199:15;49195:1;49187:6;49183:14;49176:39;49165:57;:::o;49228:229::-;49368:34;49364:1;49356:6;49352:14;49345:58;49437:12;49432:2;49424:6;49420:15;49413:37;49334:123;:::o;49463:228::-;49603:34;49599:1;49591:6;49587:14;49580:58;49672:11;49667:2;49659:6;49655:15;49648:36;49569:122;:::o;49697:182::-;49837:34;49833:1;49825:6;49821:14;49814:58;49803:76;:::o;49885:167::-;50025:19;50021:1;50013:6;50009:14;50002:43;49991:61;:::o;50058:231::-;50198:34;50194:1;50186:6;50182:14;50175:58;50267:14;50262:2;50254:6;50250:15;50243:39;50164:125;:::o;50295:161::-;50435:13;50431:1;50423:6;50419:14;50412:37;50401:55;:::o;50462:168::-;50602:20;50598:1;50590:6;50586:14;50579:44;50568:62;:::o;50636:182::-;50776:34;50772:1;50764:6;50760:14;50753:58;50742:76;:::o;50824:228::-;50964:34;50960:1;50952:6;50948:14;50941:58;51033:11;51028:2;51020:6;51016:15;51009:36;50930:122;:::o;51058:220::-;51198:34;51194:1;51186:6;51182:14;51175:58;51267:3;51262:2;51254:6;51250:15;51243:28;51164:114;:::o;51284:170::-;51424:22;51420:1;51412:6;51408:14;51401:46;51390:64;:::o;51460:236::-;51600:34;51596:1;51588:6;51584:14;51577:58;51669:19;51664:2;51656:6;51652:15;51645:44;51566:130;:::o;51702:231::-;51842:34;51838:1;51830:6;51826:14;51819:58;51911:14;51906:2;51898:6;51894:15;51887:39;51808:125;:::o;51939:167::-;52079:19;52075:1;52067:6;52063:14;52056:43;52045:61;:::o;52112:169::-;52252:21;52248:1;52240:6;52236:14;52229:45;52218:63;:::o;52287:181::-;52427:33;52423:1;52415:6;52411:14;52404:57;52393:75;:::o;52474:165::-;52614:17;52610:1;52602:6;52598:14;52591:41;52580:59;:::o;52645:118::-;52731:1;52724:5;52721:12;52711:2;;52737:18;;:::i;:::-;52711:2;52701:62;:::o;52769:122::-;52842:24;52860:5;52842:24;:::i;:::-;52835:5;52832:35;52822:2;;52881:1;52878;52871:12;52822:2;52812:79;:::o;52897:116::-;52967:21;52982:5;52967:21;:::i;:::-;52960:5;52957:32;52947:2;;53003:1;53000;52993:12;52947:2;52937:76;:::o;53019:120::-;53091:23;53108:5;53091:23;:::i;:::-;53084:5;53081:34;53071:2;;53129:1;53126;53119:12;53071:2;53061:78;:::o;53145:112::-;53231:1;53224:5;53221:12;53211:2;;53247:1;53244;53237:12;53211:2;53201:56;:::o;53263:122::-;53336:24;53354:5;53336:24;:::i;:::-;53329:5;53326:35;53316:2;;53375:1;53372;53365:12;53316:2;53306:79;:::o
Swarm Source
ipfs://c69f88cbd46ec40449eae2d2a02a485a487440707178ebb5e267143590875ef8
Loading...
Loading
Loading...
Loading
[ 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.