Token Shogun War
Overview ERC-721
Total Supply:
9,380 Shogun
Holders:
5,004 addresses
Contract:
Balance
2 Shogun
[ Download CSV Export ]
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Shogun
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Arbiscan.io on 2022-02-26 */ // File @openzeppelin/contracts/utils/introspection/[email protected] // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (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/[email protected] // OpenZeppelin Contracts v4.4.1 (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/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (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/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (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/[email protected] // OpenZeppelin Contracts v4.4.1 (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/[email protected] // OpenZeppelin Contracts v4.4.1 (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 { _setApprovalForAll(_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 Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (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/[email protected] // OpenZeppelin Contracts v4.4.1 (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/utils/math/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a / b + (a % b == 0 ? 0 : 1); } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File contracts/MinterControl.sol pragma solidity 0.8.7; abstract contract MinterControl is AccessControl { bytes32 public constant SHOGUN_OWNER_ROLE = keccak256("SHOGUN_OWNER_ROLE"); bytes32 public constant SHOGUN_MINTER_ROLE = keccak256("SHOGUN_MINTER_ROLE"); modifier onlyOwner() { require(hasRole(SHOGUN_OWNER_ROLE, _msgSender()), "MinterControl: not a SHOGUN_OWNER_ROLE"); _; } modifier onlyMinter() { require(isMinter(_msgSender()), "MinterControl: not a SHOGUN_MINTER_ROLE"); _; } constructor() { _setRoleAdmin(SHOGUN_OWNER_ROLE, SHOGUN_OWNER_ROLE); _setRoleAdmin(SHOGUN_MINTER_ROLE, SHOGUN_OWNER_ROLE); _setupRole(SHOGUN_OWNER_ROLE, _msgSender()); } function grantMinter(address _minter) external { grantRole(SHOGUN_MINTER_ROLE, _minter); } function grantMinterMass(address[] memory minters) external { for(uint i = 0; i < minters.length; i++) { grantRole(SHOGUN_MINTER_ROLE, minters[i]); } } function removeMinter(address _minter) external { revokeRole(SHOGUN_MINTER_ROLE, _minter); } function isMinter(address _minter) public view returns (bool) { return hasRole(SHOGUN_MINTER_ROLE, _minter); } function grantOwner(address _owner) external { grantRole(SHOGUN_OWNER_ROLE, _owner); } function isOwner(address _owner) public view returns (bool) { return hasRole(SHOGUN_OWNER_ROLE, _owner); } } // File contracts/Shogun.sol pragma solidity 0.8.7; contract Shogun is MinterControl, ERC721Enumerable { using Strings for uint256; using Counters for Counters.Counter; uint256 private constant nftsNumber = 13422; uint256 private constant nftsWhitelistNumber = 10000; mapping(address => bool) internal wlMinted; mapping(uint256 => bool) internal frozenShogun; Counters.Counter private _tokenIdCounter; string public baseURI; event ShogunMint(address to, uint256 tokenId); constructor() ERC721("Shogun War", "Shogun") { _tokenIdCounter._value = 1; } function supportsInterface(bytes4 interfaceId) public view override(ERC721Enumerable, AccessControl) returns (bool) { return ERC721Enumerable.supportsInterface(interfaceId) || AccessControl.supportsInterface(interfaceId); } function safeMint(address to) public onlyOwner { _mint(to); } function mintReserves(address to) public onlyOwner { for(uint i = 10000; i < 13423; i++) { _mintReserve(to, i); } } function mintReserve(address to, uint256 tokenId) public onlyOwner { require(tokenId > nftsWhitelistNumber, "Tokens number to mint must exceed number of public tokens"); _mintReserve(to, tokenId); } function mint() external onlyMinter { require(wlMinted[msg.sender] == false, "You already used your whitelist mint pass"); require(balanceOf(msg.sender) < 1, "You can only mint 1 NFT per whitelisted address"); _mint(msg.sender); wlMinted[msg.sender] = true; } function tokenURI(uint256 _tokenId) public view override returns (string memory) { require(_exists(_tokenId), "Shogun: URI query for nonexistent token"); return bytes(baseURI).length > 0 ? string(abi.encodePacked( baseURI, _tokenId.toString() )) : ""; } function _mintReserve(address _to, uint256 _tokenId) internal { emit ShogunMint(_to, _tokenId); _safeMint(_to, _tokenId); } function _mint(address _to) internal { uint256 _tokenId; _tokenId = _tokenIdCounter.current(); require(_tokenIdCounter.current() <= nftsWhitelistNumber, "Token number to mint exceeds number of whitelist tokens"); _tokenIdCounter.increment(); emit ShogunMint(_to, _tokenId); _safeMint(_to, _tokenId); } function freezeTransfer(uint256 _tokenId) external onlyOwner { frozenShogun[_tokenId] = true; } function unfreezeTransfer(uint256 _tokenId) external onlyOwner { frozenShogun[_tokenId] = false; } function _beforeTokenTransfer( address _from, address _to, uint256 _tokenId ) internal override { super._beforeTokenTransfer(_from, _to, _tokenId); require(frozenShogun[_tokenId] == false, "Shogun: Shogun is still busy, finish your assignment before transferring."); } function _baseURI() internal view override returns (string memory) { return baseURI; } // ADMIN function setBaseURI(string memory _baseURItoSet) external onlyOwner { baseURI = _baseURItoSet; } }
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":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ShogunMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SHOGUN_MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SHOGUN_OWNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"freezeTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"grantMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"minters","type":"address[]"}],"name":"grantMinterMass","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"grantOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mintReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mintReserves","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURItoSet","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"unfreezeTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280600a81526020017f53686f67756e20576172000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f53686f67756e0000000000000000000000000000000000000000000000000000815250620000b07ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b5806200018860201b60201c565b620001027f0cb8f078b79b327d22a270f4beeaec8b625c77a623beca042797690c1d54762d7ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b56200018860201b60201c565b620001437ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b562000137620001eb60201b60201c565b620001f360201b60201c565b81600190805190602001906200015b92919062000383565b5080600290805190602001906200017492919062000383565b5050506001600d6000018190555062000498565b60006200019b836200020960201b60201c565b905081600080858152602001908152602001600020600101819055508181847fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff60405160405180910390a4505050565b600033905090565b6200020582826200022860201b60201c565b5050565b6000806000838152602001908152602001600020600101549050919050565b6200023a82826200031960201b60201c565b6200031557600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620002ba620001eb60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b828054620003919062000433565b90600052602060002090601f016020900481019282620003b5576000855562000401565b82601f10620003d057805160ff191683800117855562000401565b8280016001018555821562000401579182015b8281111562000400578251825591602001919060010190620003e3565b5b50905062000410919062000414565b5090565b5b808211156200042f57600081600090555060010162000415565b5090565b600060028204905060018216806200044c57607f821691505b6020821081141562000463576200046262000469565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614ca480620004a86000396000f3fe608060405234801561001057600080fd5b50600436106102325760003560e01c80635377128111610130578063a217fddf116100b8578063c87b56dd1161007c578063c87b56dd14610695578063d547741f146106c5578063dc978059146106e1578063e985e9c5146106fd578063f91bfc7c1461072d57610232565b8063a217fddf146105f3578063a22cb46514610611578063aa271e1a1461062d578063b4549a4b1461065d578063b88d4fde1461067957610232565b806370a08231116100ff57806370a082311461053d57806389c732e71461056d5780638e825be01461058957806391d14854146105a557806395d89b41146105d557610232565b806353771281146104b757806355f804b3146104d35780636352211e146104ef5780636c0360eb1461051f57610232565b80632f2ff15d116101be57806340d097c31161018257806340d097c31461041557806341e5c93b1461043157806342842e0e1461044d57806349ab216c146104695780634f6ccce71461048757610232565b80632f2ff15d146103615780632f54bf6e1461037d5780632f745c59146103ad5780633092afd5146103dd57806336568abe146103f957610232565b80631249c58b116102055780631249c58b146102d157806318160ddd146102db57806323b872dd146102f9578063248a9ca314610315578063261707fa1461034557610232565b806301ffc9a71461023757806306fdde0314610267578063081812fc14610285578063095ea7b3146102b5575b600080fd5b610251600480360381019061024c91906134d9565b61074b565b60405161025e9190613ba6565b60405180910390f35b61026f61076d565b60405161027c9190613bdc565b60405180910390f35b61029f600480360381019061029a919061357c565b6107ff565b6040516102ac9190613b16565b60405180910390f35b6102cf60048036038101906102ca91906133e3565b610884565b005b6102d961099c565b005b6102e3610b2c565b6040516102f09190613f1e565b60405180910390f35b610313600480360381019061030e91906132cd565b610b39565b005b61032f600480360381019061032a919061346c565b610b99565b60405161033c9190613bc1565b60405180910390f35b61035f600480360381019061035a9190613260565b610bb8565b005b61037b60048036038101906103769190613499565b610be5565b005b61039760048036038101906103929190613260565b610c0e565b6040516103a49190613ba6565b60405180910390f35b6103c760048036038101906103c291906133e3565b610c41565b6040516103d49190613f1e565b60405180910390f35b6103f760048036038101906103f29190613260565b610ce6565b005b610413600480360381019061040e9190613499565b610d13565b005b61042f600480360381019061042a9190613260565b610d96565b005b61044b60048036038101906104469190613260565b610e12565b005b610467600480360381019061046291906132cd565b610eb5565b005b610471610ed5565b60405161047e9190613bc1565b60405180910390f35b6104a1600480360381019061049c919061357c565b610ef9565b6040516104ae9190613f1e565b60405180910390f35b6104d160048036038101906104cc919061357c565b610f6a565b005b6104ed60048036038101906104e89190613533565b611009565b005b6105096004803603810190610504919061357c565b611093565b6040516105169190613b16565b60405180910390f35b610527611145565b6040516105349190613bdc565b60405180910390f35b61055760048036038101906105529190613260565b6111d3565b6040516105649190613f1e565b60405180910390f35b6105876004803603810190610582919061357c565b61128b565b005b6105a3600480360381019061059e91906133e3565b61132a565b005b6105bf60048036038101906105ba9190613499565b6113ec565b6040516105cc9190613ba6565b60405180910390f35b6105dd611456565b6040516105ea9190613bdc565b60405180910390f35b6105fb6114e8565b6040516106089190613bc1565b60405180910390f35b61062b600480360381019061062691906133a3565b6114ef565b005b61064760048036038101906106429190613260565b611505565b6040516106549190613ba6565b60405180910390f35b61067760048036038101906106729190613423565b611538565b005b610693600480360381019061068e9190613320565b61159f565b005b6106af60048036038101906106aa919061357c565b611601565b6040516106bc9190613bdc565b60405180910390f35b6106df60048036038101906106da9190613499565b6116a9565b005b6106fb60048036038101906106f69190613260565b6116d2565b005b6107176004803603810190610712919061328d565b6116ff565b6040516107249190613ba6565b60405180910390f35b610735611793565b6040516107429190613bc1565b60405180910390f35b6000610756826117b7565b80610766575061076582611831565b5b9050919050565b60606001805461077c90614243565b80601f01602080910402602001604051908101604052809291908181526020018280546107a890614243565b80156107f55780601f106107ca576101008083540402835291602001916107f5565b820191906000526020600020905b8154815290600101906020018083116107d857829003601f168201915b5050505050905090565b600061080a826118ab565b610849576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084090613e1e565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061088f82611093565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610900576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f790613e5e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661091f611917565b73ffffffffffffffffffffffffffffffffffffffff16148061094e575061094d81610948611917565b6116ff565b5b61098d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098490613d7e565b60405180910390fd5b610997838361191f565b505050565b6109ac6109a7611917565b611505565b6109eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e290613d5e565b60405180910390fd5b60001515600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7590613c9e565b60405180910390fd5b6001610a89336111d3565b10610ac9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac090613c3e565b60405180910390fd5b610ad2336119d8565b6001600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550565b6000600980549050905090565b610b4a610b44611917565b82611a85565b610b89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8090613e7e565b60405180910390fd5b610b94838383611b63565b505050565b6000806000838152602001908152602001600020600101549050919050565b610be27f0cb8f078b79b327d22a270f4beeaec8b625c77a623beca042797690c1d54762d82610be5565b50565b610bee82610b99565b610bff81610bfa611917565b611dbf565b610c098383611e5c565b505050565b6000610c3a7ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b5836113ec565b9050919050565b6000610c4c836111d3565b8210610c8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8490613c5e565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610d107f0cb8f078b79b327d22a270f4beeaec8b625c77a623beca042797690c1d54762d826116a9565b50565b610d1b611917565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7f90613efe565b60405180910390fd5b610d928282611f3c565b5050565b610dc77ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b5610dc2611917565b6113ec565b610e06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfd90613dde565b60405180910390fd5b610e0f816119d8565b50565b610e437ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b5610e3e611917565b6113ec565b610e82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7990613dde565b60405180910390fd5b600061271090505b61346f811015610eb157610e9e828261201d565b8080610ea9906142a6565b915050610e8a565b5050565b610ed08383836040518060200160405280600081525061159f565b505050565b7ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b581565b6000610f03610b2c565b8210610f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3b90613e9e565b60405180910390fd5b60098281548110610f5857610f576143dc565b5b90600052602060002001549050919050565b610f9b7ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b5610f96611917565b6113ec565b610fda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd190613dde565b60405180910390fd5b6001600c600083815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61103a7ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b5611035611917565b6113ec565b611079576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107090613dde565b60405180910390fd5b80600e908051906020019061108f929190612fc1565b5050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561113c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113390613dbe565b60405180910390fd5b80915050919050565b600e805461115290614243565b80601f016020809104026020016040519081016040528092919081815260200182805461117e90614243565b80156111cb5780601f106111a0576101008083540402835291602001916111cb565b820191906000526020600020905b8154815290600101906020018083116111ae57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611244576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123b90613d9e565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112bc7ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b56112b7611917565b6113ec565b6112fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f290613dde565b60405180910390fd5b6000600c600083815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61135b7ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b5611356611917565b6113ec565b61139a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139190613dde565b60405180910390fd5b61271081116113de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d590613ede565b60405180910390fd5b6113e8828261201d565b5050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606002805461146590614243565b80601f016020809104026020016040519081016040528092919081815260200182805461149190614243565b80156114de5780601f106114b3576101008083540402835291602001916114de565b820191906000526020600020905b8154815290600101906020018083116114c157829003601f168201915b5050505050905090565b6000801b81565b6115016114fa611917565b8383612064565b5050565b60006115317f0cb8f078b79b327d22a270f4beeaec8b625c77a623beca042797690c1d54762d836113ec565b9050919050565b60005b815181101561159b576115887f0cb8f078b79b327d22a270f4beeaec8b625c77a623beca042797690c1d54762d83838151811061157b5761157a6143dc565b5b6020026020010151610be5565b8080611593906142a6565b91505061153b565b5050565b6115b06115aa611917565b83611a85565b6115ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e690613e7e565b60405180910390fd5b6115fb848484846121d1565b50505050565b606061160c826118ab565b61164b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164290613ebe565b60405180910390fd5b6000600e805461165a90614243565b90501161167657604051806020016040528060008152506116a2565b600e6116818361222d565b604051602001611692929190613ab8565b6040516020818303038152906040525b9050919050565b6116b282610b99565b6116c3816116be611917565b611dbf565b6116cd8383611f3c565b505050565b6116fc7ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b582610be5565b50565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b7f0cb8f078b79b327d22a270f4beeaec8b625c77a623beca042797690c1d54762d81565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061182a57506118298261238e565b5b9050919050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806118a457506118a382612470565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661199283611093565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006119e4600d6124da565b90506127106119f3600d6124da565b1115611a34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2b90613cde565b60405180910390fd5b611a3e600d6124e8565b7f95498bab9d74f6f5ae2ab7a9dae405881992d9d1592649f41669f70e84d909b58282604051611a6f929190613b7d565b60405180910390a1611a8182826124fe565b5050565b6000611a90826118ab565b611acf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac690613d3e565b60405180910390fd5b6000611ada83611093565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611b4957508373ffffffffffffffffffffffffffffffffffffffff16611b31846107ff565b73ffffffffffffffffffffffffffffffffffffffff16145b80611b5a5750611b5981856116ff565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b8382611093565b73ffffffffffffffffffffffffffffffffffffffff1614611bd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd090613e3e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4090613cfe565b60405180910390fd5b611c5483838361251c565b611c5f60008261191f565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611caf9190614125565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d069190614044565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611dc982826113ec565b611e5857611dee8173ffffffffffffffffffffffffffffffffffffffff166014612593565b611dfc8360001c6020612593565b604051602001611e0d929190613adc565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4f9190613bdc565b60405180910390fd5b5050565b611e6682826113ec565b611f3857600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611edd611917565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611f4682826113ec565b1561201957600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611fbe611917565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b7f95498bab9d74f6f5ae2ab7a9dae405881992d9d1592649f41669f70e84d909b5828260405161204e929190613b7d565b60405180910390a161206082826124fe565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156120d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ca90613d1e565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121c49190613ba6565b60405180910390a3505050565b6121dc848484611b63565b6121e8848484846127cf565b612227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221e90613c7e565b60405180910390fd5b50505050565b60606000821415612275576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612389565b600082905060005b600082146122a7578080612290906142a6565b915050600a826122a0919061409a565b915061227d565b60008167ffffffffffffffff8111156122c3576122c261440b565b5b6040519080825280601f01601f1916602001820160405280156122f55781602001600182028036833780820191505090505b5090505b600085146123825760018261230e9190614125565b9150600a8561231d91906142ef565b60306123299190614044565b60f81b81838151811061233f5761233e6143dc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561237b919061409a565b94506122f9565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061245957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612469575061246882611831565b5b9050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081600001549050919050565b6001816000016000828254019250508190555050565b612518828260405180602001604052806000815250612966565b5050565b6125278383836129c1565b60001515600c600083815260200190815260200160002060009054906101000a900460ff1615151461258e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258590613c1e565b60405180910390fd5b505050565b6060600060028360026125a691906140cb565b6125b09190614044565b67ffffffffffffffff8111156125c9576125c861440b565b5b6040519080825280601f01601f1916602001820160405280156125fb5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612633576126326143dc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612697576126966143dc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026126d791906140cb565b6126e19190614044565b90505b6001811115612781577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612723576127226143dc565b5b1a60f81b82828151811061273a576127396143dc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061277a90614219565b90506126e4565b50600084146127c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127bc90613bfe565b60405180910390fd5b8091505092915050565b60006127f08473ffffffffffffffffffffffffffffffffffffffff16612ad5565b15612959578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612819611917565b8786866040518563ffffffff1660e01b815260040161283b9493929190613b31565b602060405180830381600087803b15801561285557600080fd5b505af192505050801561288657506040513d601f19601f820116820180604052508101906128839190613506565b60015b612909573d80600081146128b6576040519150601f19603f3d011682016040523d82523d6000602084013e6128bb565b606091505b50600081511415612901576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f890613c7e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061295e565b600190505b949350505050565b6129708383612ae8565b61297d60008484846127cf565b6129bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b390613c7e565b60405180910390fd5b505050565b6129cc838383612cb6565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a0f57612a0a81612cbb565b612a4e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612a4d57612a4c8382612d04565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a9157612a8c81612e71565b612ad0565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612acf57612ace8282612f42565b5b5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4f90613dfe565b60405180910390fd5b612b61816118ab565b15612ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9890613cbe565b60405180910390fd5b612bad6000838361251c565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bfd9190614044565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612d11846111d3565b612d1b9190614125565b9050600060086000848152602001908152602001600020549050818114612e00576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600980549050612e859190614125565b90506000600a6000848152602001908152602001600020549050600060098381548110612eb557612eb46143dc565b5b906000526020600020015490508060098381548110612ed757612ed66143dc565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a6000858152602001908152602001600020600090556009805480612f2657612f256143ad565b5b6001900381819060005260206000200160009055905550505050565b6000612f4d836111d3565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b828054612fcd90614243565b90600052602060002090601f016020900481019282612fef5760008555613036565b82601f1061300857805160ff1916838001178555613036565b82800160010185558215613036579182015b8281111561303557825182559160200191906001019061301a565b5b5090506130439190613047565b5090565b5b80821115613060576000816000905550600101613048565b5090565b600061307761307284613f5e565b613f39565b9050808382526020820190508285602086028201111561309a5761309961443f565b5b60005b858110156130ca57816130b08882613158565b84526020840193506020830192505060018101905061309d565b5050509392505050565b60006130e76130e284613f8a565b613f39565b90508281526020810184848401111561310357613102614444565b5b61310e8482856141d7565b509392505050565b600061312961312484613fbb565b613f39565b90508281526020810184848401111561314557613144614444565b5b6131508482856141d7565b509392505050565b60008135905061316781614bfb565b92915050565b600082601f8301126131825761318161443a565b5b8135613192848260208601613064565b91505092915050565b6000813590506131aa81614c12565b92915050565b6000813590506131bf81614c29565b92915050565b6000813590506131d481614c40565b92915050565b6000815190506131e981614c40565b92915050565b600082601f8301126132045761320361443a565b5b81356132148482602086016130d4565b91505092915050565b600082601f8301126132325761323161443a565b5b8135613242848260208601613116565b91505092915050565b60008135905061325a81614c57565b92915050565b6000602082840312156132765761327561444e565b5b600061328484828501613158565b91505092915050565b600080604083850312156132a4576132a361444e565b5b60006132b285828601613158565b92505060206132c385828601613158565b9150509250929050565b6000806000606084860312156132e6576132e561444e565b5b60006132f486828701613158565b935050602061330586828701613158565b92505060406133168682870161324b565b9150509250925092565b6000806000806080858703121561333a5761333961444e565b5b600061334887828801613158565b945050602061335987828801613158565b935050604061336a8782880161324b565b925050606085013567ffffffffffffffff81111561338b5761338a614449565b5b613397878288016131ef565b91505092959194509250565b600080604083850312156133ba576133b961444e565b5b60006133c885828601613158565b92505060206133d98582860161319b565b9150509250929050565b600080604083850312156133fa576133f961444e565b5b600061340885828601613158565b92505060206134198582860161324b565b9150509250929050565b6000602082840312156134395761343861444e565b5b600082013567ffffffffffffffff81111561345757613456614449565b5b6134638482850161316d565b91505092915050565b6000602082840312156134825761348161444e565b5b6000613490848285016131b0565b91505092915050565b600080604083850312156134b0576134af61444e565b5b60006134be858286016131b0565b92505060206134cf85828601613158565b9150509250929050565b6000602082840312156134ef576134ee61444e565b5b60006134fd848285016131c5565b91505092915050565b60006020828403121561351c5761351b61444e565b5b600061352a848285016131da565b91505092915050565b6000602082840312156135495761354861444e565b5b600082013567ffffffffffffffff81111561356757613566614449565b5b6135738482850161321d565b91505092915050565b6000602082840312156135925761359161444e565b5b60006135a08482850161324b565b91505092915050565b6135b281614159565b82525050565b6135c18161416b565b82525050565b6135d081614177565b82525050565b60006135e182614001565b6135eb8185614017565b93506135fb8185602086016141e6565b61360481614453565b840191505092915050565b600061361a8261400c565b6136248185614028565b93506136348185602086016141e6565b61363d81614453565b840191505092915050565b60006136538261400c565b61365d8185614039565b935061366d8185602086016141e6565b80840191505092915050565b6000815461368681614243565b6136908186614039565b945060018216600081146136ab57600181146136bc576136ef565b60ff198316865281860193506136ef565b6136c585613fec565b60005b838110156136e7578154818901526001820191506020810190506136c8565b838801955050505b50505092915050565b6000613705602083614028565b915061371082614464565b602082019050919050565b6000613728604983614028565b91506137338261448d565b606082019050919050565b600061374b602f83614028565b915061375682614502565b604082019050919050565b600061376e602b83614028565b915061377982614551565b604082019050919050565b6000613791603283614028565b915061379c826145a0565b604082019050919050565b60006137b4602983614028565b91506137bf826145ef565b604082019050919050565b60006137d7601c83614028565b91506137e28261463e565b602082019050919050565b60006137fa603783614028565b915061380582614667565b604082019050919050565b600061381d602483614028565b9150613828826146b6565b604082019050919050565b6000613840601983614028565b915061384b82614705565b602082019050919050565b6000613863602c83614028565b915061386e8261472e565b604082019050919050565b6000613886602783614028565b91506138918261477d565b604082019050919050565b60006138a9603883614028565b91506138b4826147cc565b604082019050919050565b60006138cc602a83614028565b91506138d78261481b565b604082019050919050565b60006138ef602983614028565b91506138fa8261486a565b604082019050919050565b6000613912602683614028565b915061391d826148b9565b604082019050919050565b6000613935602083614028565b915061394082614908565b602082019050919050565b6000613958602c83614028565b915061396382614931565b604082019050919050565b600061397b602983614028565b915061398682614980565b604082019050919050565b600061399e602183614028565b91506139a9826149cf565b604082019050919050565b60006139c1603183614028565b91506139cc82614a1e565b604082019050919050565b60006139e4602c83614028565b91506139ef82614a6d565b604082019050919050565b6000613a07601783614039565b9150613a1282614abc565b601782019050919050565b6000613a2a602783614028565b9150613a3582614ae5565b604082019050919050565b6000613a4d603983614028565b9150613a5882614b34565b604082019050919050565b6000613a70601183614039565b9150613a7b82614b83565b601182019050919050565b6000613a93602f83614028565b9150613a9e82614bac565b604082019050919050565b613ab2816141cd565b82525050565b6000613ac48285613679565b9150613ad08284613648565b91508190509392505050565b6000613ae7826139fa565b9150613af38285613648565b9150613afe82613a63565b9150613b0a8284613648565b91508190509392505050565b6000602082019050613b2b60008301846135a9565b92915050565b6000608082019050613b4660008301876135a9565b613b5360208301866135a9565b613b606040830185613aa9565b8181036060830152613b7281846135d6565b905095945050505050565b6000604082019050613b9260008301856135a9565b613b9f6020830184613aa9565b9392505050565b6000602082019050613bbb60008301846135b8565b92915050565b6000602082019050613bd660008301846135c7565b92915050565b60006020820190508181036000830152613bf6818461360f565b905092915050565b60006020820190508181036000830152613c17816136f8565b9050919050565b60006020820190508181036000830152613c378161371b565b9050919050565b60006020820190508181036000830152613c578161373e565b9050919050565b60006020820190508181036000830152613c7781613761565b9050919050565b60006020820190508181036000830152613c9781613784565b9050919050565b60006020820190508181036000830152613cb7816137a7565b9050919050565b60006020820190508181036000830152613cd7816137ca565b9050919050565b60006020820190508181036000830152613cf7816137ed565b9050919050565b60006020820190508181036000830152613d1781613810565b9050919050565b60006020820190508181036000830152613d3781613833565b9050919050565b60006020820190508181036000830152613d5781613856565b9050919050565b60006020820190508181036000830152613d7781613879565b9050919050565b60006020820190508181036000830152613d978161389c565b9050919050565b60006020820190508181036000830152613db7816138bf565b9050919050565b60006020820190508181036000830152613dd7816138e2565b9050919050565b60006020820190508181036000830152613df781613905565b9050919050565b60006020820190508181036000830152613e1781613928565b9050919050565b60006020820190508181036000830152613e378161394b565b9050919050565b60006020820190508181036000830152613e578161396e565b9050919050565b60006020820190508181036000830152613e7781613991565b9050919050565b60006020820190508181036000830152613e97816139b4565b9050919050565b60006020820190508181036000830152613eb7816139d7565b9050919050565b60006020820190508181036000830152613ed781613a1d565b9050919050565b60006020820190508181036000830152613ef781613a40565b9050919050565b60006020820190508181036000830152613f1781613a86565b9050919050565b6000602082019050613f336000830184613aa9565b92915050565b6000613f43613f54565b9050613f4f8282614275565b919050565b6000604051905090565b600067ffffffffffffffff821115613f7957613f7861440b565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613fa557613fa461440b565b5b613fae82614453565b9050602081019050919050565b600067ffffffffffffffff821115613fd657613fd561440b565b5b613fdf82614453565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061404f826141cd565b915061405a836141cd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561408f5761408e614320565b5b828201905092915050565b60006140a5826141cd565b91506140b0836141cd565b9250826140c0576140bf61434f565b5b828204905092915050565b60006140d6826141cd565b91506140e1836141cd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561411a57614119614320565b5b828202905092915050565b6000614130826141cd565b915061413b836141cd565b92508282101561414e5761414d614320565b5b828203905092915050565b6000614164826141ad565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156142045780820151818401526020810190506141e9565b83811115614213576000848401525b50505050565b6000614224826141cd565b9150600082141561423857614237614320565b5b600182039050919050565b6000600282049050600182168061425b57607f821691505b6020821081141561426f5761426e61437e565b5b50919050565b61427e82614453565b810181811067ffffffffffffffff8211171561429d5761429c61440b565b5b80604052505050565b60006142b1826141cd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156142e4576142e3614320565b5b600182019050919050565b60006142fa826141cd565b9150614305836141cd565b9250826143155761431461434f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f53686f67756e3a2053686f67756e206973207374696c6c20627573792c20666960008201527f6e69736820796f75722061737369676e6d656e74206265666f7265207472616e60208201527f7366657272696e672e0000000000000000000000000000000000000000000000604082015250565b7f596f752063616e206f6e6c79206d696e742031204e465420706572207768697460008201527f656c697374656420616464726573730000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f596f7520616c7265616479207573656420796f75722077686974656c6973742060008201527f6d696e7420706173730000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f546f6b656e206e756d62657220746f206d696e742065786365656473206e756d60008201527f626572206f662077686974656c69737420746f6b656e73000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4d696e746572436f6e74726f6c3a206e6f7420612053484f47554e5f4d494e5460008201527f45525f524f4c4500000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4d696e746572436f6e74726f6c3a206e6f7420612053484f47554e5f4f574e4560008201527f525f524f4c450000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f53686f67756e3a2055524920717565727920666f72206e6f6e6578697374656e60008201527f7420746f6b656e00000000000000000000000000000000000000000000000000602082015250565b7f546f6b656e73206e756d62657220746f206d696e74206d75737420657863656560008201527f64206e756d626572206f66207075626c696320746f6b656e7300000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b614c0481614159565b8114614c0f57600080fd5b50565b614c1b8161416b565b8114614c2657600080fd5b50565b614c3281614177565b8114614c3d57600080fd5b50565b614c4981614181565b8114614c5457600080fd5b50565b614c60816141cd565b8114614c6b57600080fd5b5056fea2646970667358221220e7d6eb79e8012a0f28288693929659a29caaf3c0f1495be1ea190d196457917764736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102325760003560e01c80635377128111610130578063a217fddf116100b8578063c87b56dd1161007c578063c87b56dd14610695578063d547741f146106c5578063dc978059146106e1578063e985e9c5146106fd578063f91bfc7c1461072d57610232565b8063a217fddf146105f3578063a22cb46514610611578063aa271e1a1461062d578063b4549a4b1461065d578063b88d4fde1461067957610232565b806370a08231116100ff57806370a082311461053d57806389c732e71461056d5780638e825be01461058957806391d14854146105a557806395d89b41146105d557610232565b806353771281146104b757806355f804b3146104d35780636352211e146104ef5780636c0360eb1461051f57610232565b80632f2ff15d116101be57806340d097c31161018257806340d097c31461041557806341e5c93b1461043157806342842e0e1461044d57806349ab216c146104695780634f6ccce71461048757610232565b80632f2ff15d146103615780632f54bf6e1461037d5780632f745c59146103ad5780633092afd5146103dd57806336568abe146103f957610232565b80631249c58b116102055780631249c58b146102d157806318160ddd146102db57806323b872dd146102f9578063248a9ca314610315578063261707fa1461034557610232565b806301ffc9a71461023757806306fdde0314610267578063081812fc14610285578063095ea7b3146102b5575b600080fd5b610251600480360381019061024c91906134d9565b61074b565b60405161025e9190613ba6565b60405180910390f35b61026f61076d565b60405161027c9190613bdc565b60405180910390f35b61029f600480360381019061029a919061357c565b6107ff565b6040516102ac9190613b16565b60405180910390f35b6102cf60048036038101906102ca91906133e3565b610884565b005b6102d961099c565b005b6102e3610b2c565b6040516102f09190613f1e565b60405180910390f35b610313600480360381019061030e91906132cd565b610b39565b005b61032f600480360381019061032a919061346c565b610b99565b60405161033c9190613bc1565b60405180910390f35b61035f600480360381019061035a9190613260565b610bb8565b005b61037b60048036038101906103769190613499565b610be5565b005b61039760048036038101906103929190613260565b610c0e565b6040516103a49190613ba6565b60405180910390f35b6103c760048036038101906103c291906133e3565b610c41565b6040516103d49190613f1e565b60405180910390f35b6103f760048036038101906103f29190613260565b610ce6565b005b610413600480360381019061040e9190613499565b610d13565b005b61042f600480360381019061042a9190613260565b610d96565b005b61044b60048036038101906104469190613260565b610e12565b005b610467600480360381019061046291906132cd565b610eb5565b005b610471610ed5565b60405161047e9190613bc1565b60405180910390f35b6104a1600480360381019061049c919061357c565b610ef9565b6040516104ae9190613f1e565b60405180910390f35b6104d160048036038101906104cc919061357c565b610f6a565b005b6104ed60048036038101906104e89190613533565b611009565b005b6105096004803603810190610504919061357c565b611093565b6040516105169190613b16565b60405180910390f35b610527611145565b6040516105349190613bdc565b60405180910390f35b61055760048036038101906105529190613260565b6111d3565b6040516105649190613f1e565b60405180910390f35b6105876004803603810190610582919061357c565b61128b565b005b6105a3600480360381019061059e91906133e3565b61132a565b005b6105bf60048036038101906105ba9190613499565b6113ec565b6040516105cc9190613ba6565b60405180910390f35b6105dd611456565b6040516105ea9190613bdc565b60405180910390f35b6105fb6114e8565b6040516106089190613bc1565b60405180910390f35b61062b600480360381019061062691906133a3565b6114ef565b005b61064760048036038101906106429190613260565b611505565b6040516106549190613ba6565b60405180910390f35b61067760048036038101906106729190613423565b611538565b005b610693600480360381019061068e9190613320565b61159f565b005b6106af60048036038101906106aa919061357c565b611601565b6040516106bc9190613bdc565b60405180910390f35b6106df60048036038101906106da9190613499565b6116a9565b005b6106fb60048036038101906106f69190613260565b6116d2565b005b6107176004803603810190610712919061328d565b6116ff565b6040516107249190613ba6565b60405180910390f35b610735611793565b6040516107429190613bc1565b60405180910390f35b6000610756826117b7565b80610766575061076582611831565b5b9050919050565b60606001805461077c90614243565b80601f01602080910402602001604051908101604052809291908181526020018280546107a890614243565b80156107f55780601f106107ca576101008083540402835291602001916107f5565b820191906000526020600020905b8154815290600101906020018083116107d857829003601f168201915b5050505050905090565b600061080a826118ab565b610849576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084090613e1e565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061088f82611093565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610900576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f790613e5e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661091f611917565b73ffffffffffffffffffffffffffffffffffffffff16148061094e575061094d81610948611917565b6116ff565b5b61098d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098490613d7e565b60405180910390fd5b610997838361191f565b505050565b6109ac6109a7611917565b611505565b6109eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e290613d5e565b60405180910390fd5b60001515600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7590613c9e565b60405180910390fd5b6001610a89336111d3565b10610ac9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac090613c3e565b60405180910390fd5b610ad2336119d8565b6001600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550565b6000600980549050905090565b610b4a610b44611917565b82611a85565b610b89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8090613e7e565b60405180910390fd5b610b94838383611b63565b505050565b6000806000838152602001908152602001600020600101549050919050565b610be27f0cb8f078b79b327d22a270f4beeaec8b625c77a623beca042797690c1d54762d82610be5565b50565b610bee82610b99565b610bff81610bfa611917565b611dbf565b610c098383611e5c565b505050565b6000610c3a7ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b5836113ec565b9050919050565b6000610c4c836111d3565b8210610c8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8490613c5e565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610d107f0cb8f078b79b327d22a270f4beeaec8b625c77a623beca042797690c1d54762d826116a9565b50565b610d1b611917565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7f90613efe565b60405180910390fd5b610d928282611f3c565b5050565b610dc77ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b5610dc2611917565b6113ec565b610e06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfd90613dde565b60405180910390fd5b610e0f816119d8565b50565b610e437ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b5610e3e611917565b6113ec565b610e82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7990613dde565b60405180910390fd5b600061271090505b61346f811015610eb157610e9e828261201d565b8080610ea9906142a6565b915050610e8a565b5050565b610ed08383836040518060200160405280600081525061159f565b505050565b7ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b581565b6000610f03610b2c565b8210610f44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3b90613e9e565b60405180910390fd5b60098281548110610f5857610f576143dc565b5b90600052602060002001549050919050565b610f9b7ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b5610f96611917565b6113ec565b610fda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd190613dde565b60405180910390fd5b6001600c600083815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61103a7ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b5611035611917565b6113ec565b611079576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107090613dde565b60405180910390fd5b80600e908051906020019061108f929190612fc1565b5050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561113c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113390613dbe565b60405180910390fd5b80915050919050565b600e805461115290614243565b80601f016020809104026020016040519081016040528092919081815260200182805461117e90614243565b80156111cb5780601f106111a0576101008083540402835291602001916111cb565b820191906000526020600020905b8154815290600101906020018083116111ae57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611244576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123b90613d9e565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112bc7ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b56112b7611917565b6113ec565b6112fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f290613dde565b60405180910390fd5b6000600c600083815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61135b7ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b5611356611917565b6113ec565b61139a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139190613dde565b60405180910390fd5b61271081116113de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d590613ede565b60405180910390fd5b6113e8828261201d565b5050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606002805461146590614243565b80601f016020809104026020016040519081016040528092919081815260200182805461149190614243565b80156114de5780601f106114b3576101008083540402835291602001916114de565b820191906000526020600020905b8154815290600101906020018083116114c157829003601f168201915b5050505050905090565b6000801b81565b6115016114fa611917565b8383612064565b5050565b60006115317f0cb8f078b79b327d22a270f4beeaec8b625c77a623beca042797690c1d54762d836113ec565b9050919050565b60005b815181101561159b576115887f0cb8f078b79b327d22a270f4beeaec8b625c77a623beca042797690c1d54762d83838151811061157b5761157a6143dc565b5b6020026020010151610be5565b8080611593906142a6565b91505061153b565b5050565b6115b06115aa611917565b83611a85565b6115ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e690613e7e565b60405180910390fd5b6115fb848484846121d1565b50505050565b606061160c826118ab565b61164b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164290613ebe565b60405180910390fd5b6000600e805461165a90614243565b90501161167657604051806020016040528060008152506116a2565b600e6116818361222d565b604051602001611692929190613ab8565b6040516020818303038152906040525b9050919050565b6116b282610b99565b6116c3816116be611917565b611dbf565b6116cd8383611f3c565b505050565b6116fc7ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b582610be5565b50565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b7f0cb8f078b79b327d22a270f4beeaec8b625c77a623beca042797690c1d54762d81565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061182a57506118298261238e565b5b9050919050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806118a457506118a382612470565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661199283611093565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006119e4600d6124da565b90506127106119f3600d6124da565b1115611a34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2b90613cde565b60405180910390fd5b611a3e600d6124e8565b7f95498bab9d74f6f5ae2ab7a9dae405881992d9d1592649f41669f70e84d909b58282604051611a6f929190613b7d565b60405180910390a1611a8182826124fe565b5050565b6000611a90826118ab565b611acf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac690613d3e565b60405180910390fd5b6000611ada83611093565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611b4957508373ffffffffffffffffffffffffffffffffffffffff16611b31846107ff565b73ffffffffffffffffffffffffffffffffffffffff16145b80611b5a5750611b5981856116ff565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b8382611093565b73ffffffffffffffffffffffffffffffffffffffff1614611bd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd090613e3e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4090613cfe565b60405180910390fd5b611c5483838361251c565b611c5f60008261191f565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611caf9190614125565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d069190614044565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611dc982826113ec565b611e5857611dee8173ffffffffffffffffffffffffffffffffffffffff166014612593565b611dfc8360001c6020612593565b604051602001611e0d929190613adc565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4f9190613bdc565b60405180910390fd5b5050565b611e6682826113ec565b611f3857600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611edd611917565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611f4682826113ec565b1561201957600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611fbe611917565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b7f95498bab9d74f6f5ae2ab7a9dae405881992d9d1592649f41669f70e84d909b5828260405161204e929190613b7d565b60405180910390a161206082826124fe565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156120d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ca90613d1e565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121c49190613ba6565b60405180910390a3505050565b6121dc848484611b63565b6121e8848484846127cf565b612227576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221e90613c7e565b60405180910390fd5b50505050565b60606000821415612275576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612389565b600082905060005b600082146122a7578080612290906142a6565b915050600a826122a0919061409a565b915061227d565b60008167ffffffffffffffff8111156122c3576122c261440b565b5b6040519080825280601f01601f1916602001820160405280156122f55781602001600182028036833780820191505090505b5090505b600085146123825760018261230e9190614125565b9150600a8561231d91906142ef565b60306123299190614044565b60f81b81838151811061233f5761233e6143dc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561237b919061409a565b94506122f9565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061245957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612469575061246882611831565b5b9050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081600001549050919050565b6001816000016000828254019250508190555050565b612518828260405180602001604052806000815250612966565b5050565b6125278383836129c1565b60001515600c600083815260200190815260200160002060009054906101000a900460ff1615151461258e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258590613c1e565b60405180910390fd5b505050565b6060600060028360026125a691906140cb565b6125b09190614044565b67ffffffffffffffff8111156125c9576125c861440b565b5b6040519080825280601f01601f1916602001820160405280156125fb5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612633576126326143dc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612697576126966143dc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026126d791906140cb565b6126e19190614044565b90505b6001811115612781577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612723576127226143dc565b5b1a60f81b82828151811061273a576127396143dc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061277a90614219565b90506126e4565b50600084146127c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127bc90613bfe565b60405180910390fd5b8091505092915050565b60006127f08473ffffffffffffffffffffffffffffffffffffffff16612ad5565b15612959578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612819611917565b8786866040518563ffffffff1660e01b815260040161283b9493929190613b31565b602060405180830381600087803b15801561285557600080fd5b505af192505050801561288657506040513d601f19601f820116820180604052508101906128839190613506565b60015b612909573d80600081146128b6576040519150601f19603f3d011682016040523d82523d6000602084013e6128bb565b606091505b50600081511415612901576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128f890613c7e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061295e565b600190505b949350505050565b6129708383612ae8565b61297d60008484846127cf565b6129bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b390613c7e565b60405180910390fd5b505050565b6129cc838383612cb6565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a0f57612a0a81612cbb565b612a4e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612a4d57612a4c8382612d04565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a9157612a8c81612e71565b612ad0565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612acf57612ace8282612f42565b5b5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4f90613dfe565b60405180910390fd5b612b61816118ab565b15612ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9890613cbe565b60405180910390fd5b612bad6000838361251c565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bfd9190614044565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612d11846111d3565b612d1b9190614125565b9050600060086000848152602001908152602001600020549050818114612e00576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600980549050612e859190614125565b90506000600a6000848152602001908152602001600020549050600060098381548110612eb557612eb46143dc565b5b906000526020600020015490508060098381548110612ed757612ed66143dc565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a6000858152602001908152602001600020600090556009805480612f2657612f256143ad565b5b6001900381819060005260206000200160009055905550505050565b6000612f4d836111d3565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b828054612fcd90614243565b90600052602060002090601f016020900481019282612fef5760008555613036565b82601f1061300857805160ff1916838001178555613036565b82800160010185558215613036579182015b8281111561303557825182559160200191906001019061301a565b5b5090506130439190613047565b5090565b5b80821115613060576000816000905550600101613048565b5090565b600061307761307284613f5e565b613f39565b9050808382526020820190508285602086028201111561309a5761309961443f565b5b60005b858110156130ca57816130b08882613158565b84526020840193506020830192505060018101905061309d565b5050509392505050565b60006130e76130e284613f8a565b613f39565b90508281526020810184848401111561310357613102614444565b5b61310e8482856141d7565b509392505050565b600061312961312484613fbb565b613f39565b90508281526020810184848401111561314557613144614444565b5b6131508482856141d7565b509392505050565b60008135905061316781614bfb565b92915050565b600082601f8301126131825761318161443a565b5b8135613192848260208601613064565b91505092915050565b6000813590506131aa81614c12565b92915050565b6000813590506131bf81614c29565b92915050565b6000813590506131d481614c40565b92915050565b6000815190506131e981614c40565b92915050565b600082601f8301126132045761320361443a565b5b81356132148482602086016130d4565b91505092915050565b600082601f8301126132325761323161443a565b5b8135613242848260208601613116565b91505092915050565b60008135905061325a81614c57565b92915050565b6000602082840312156132765761327561444e565b5b600061328484828501613158565b91505092915050565b600080604083850312156132a4576132a361444e565b5b60006132b285828601613158565b92505060206132c385828601613158565b9150509250929050565b6000806000606084860312156132e6576132e561444e565b5b60006132f486828701613158565b935050602061330586828701613158565b92505060406133168682870161324b565b9150509250925092565b6000806000806080858703121561333a5761333961444e565b5b600061334887828801613158565b945050602061335987828801613158565b935050604061336a8782880161324b565b925050606085013567ffffffffffffffff81111561338b5761338a614449565b5b613397878288016131ef565b91505092959194509250565b600080604083850312156133ba576133b961444e565b5b60006133c885828601613158565b92505060206133d98582860161319b565b9150509250929050565b600080604083850312156133fa576133f961444e565b5b600061340885828601613158565b92505060206134198582860161324b565b9150509250929050565b6000602082840312156134395761343861444e565b5b600082013567ffffffffffffffff81111561345757613456614449565b5b6134638482850161316d565b91505092915050565b6000602082840312156134825761348161444e565b5b6000613490848285016131b0565b91505092915050565b600080604083850312156134b0576134af61444e565b5b60006134be858286016131b0565b92505060206134cf85828601613158565b9150509250929050565b6000602082840312156134ef576134ee61444e565b5b60006134fd848285016131c5565b91505092915050565b60006020828403121561351c5761351b61444e565b5b600061352a848285016131da565b91505092915050565b6000602082840312156135495761354861444e565b5b600082013567ffffffffffffffff81111561356757613566614449565b5b6135738482850161321d565b91505092915050565b6000602082840312156135925761359161444e565b5b60006135a08482850161324b565b91505092915050565b6135b281614159565b82525050565b6135c18161416b565b82525050565b6135d081614177565b82525050565b60006135e182614001565b6135eb8185614017565b93506135fb8185602086016141e6565b61360481614453565b840191505092915050565b600061361a8261400c565b6136248185614028565b93506136348185602086016141e6565b61363d81614453565b840191505092915050565b60006136538261400c565b61365d8185614039565b935061366d8185602086016141e6565b80840191505092915050565b6000815461368681614243565b6136908186614039565b945060018216600081146136ab57600181146136bc576136ef565b60ff198316865281860193506136ef565b6136c585613fec565b60005b838110156136e7578154818901526001820191506020810190506136c8565b838801955050505b50505092915050565b6000613705602083614028565b915061371082614464565b602082019050919050565b6000613728604983614028565b91506137338261448d565b606082019050919050565b600061374b602f83614028565b915061375682614502565b604082019050919050565b600061376e602b83614028565b915061377982614551565b604082019050919050565b6000613791603283614028565b915061379c826145a0565b604082019050919050565b60006137b4602983614028565b91506137bf826145ef565b604082019050919050565b60006137d7601c83614028565b91506137e28261463e565b602082019050919050565b60006137fa603783614028565b915061380582614667565b604082019050919050565b600061381d602483614028565b9150613828826146b6565b604082019050919050565b6000613840601983614028565b915061384b82614705565b602082019050919050565b6000613863602c83614028565b915061386e8261472e565b604082019050919050565b6000613886602783614028565b91506138918261477d565b604082019050919050565b60006138a9603883614028565b91506138b4826147cc565b604082019050919050565b60006138cc602a83614028565b91506138d78261481b565b604082019050919050565b60006138ef602983614028565b91506138fa8261486a565b604082019050919050565b6000613912602683614028565b915061391d826148b9565b604082019050919050565b6000613935602083614028565b915061394082614908565b602082019050919050565b6000613958602c83614028565b915061396382614931565b604082019050919050565b600061397b602983614028565b915061398682614980565b604082019050919050565b600061399e602183614028565b91506139a9826149cf565b604082019050919050565b60006139c1603183614028565b91506139cc82614a1e565b604082019050919050565b60006139e4602c83614028565b91506139ef82614a6d565b604082019050919050565b6000613a07601783614039565b9150613a1282614abc565b601782019050919050565b6000613a2a602783614028565b9150613a3582614ae5565b604082019050919050565b6000613a4d603983614028565b9150613a5882614b34565b604082019050919050565b6000613a70601183614039565b9150613a7b82614b83565b601182019050919050565b6000613a93602f83614028565b9150613a9e82614bac565b604082019050919050565b613ab2816141cd565b82525050565b6000613ac48285613679565b9150613ad08284613648565b91508190509392505050565b6000613ae7826139fa565b9150613af38285613648565b9150613afe82613a63565b9150613b0a8284613648565b91508190509392505050565b6000602082019050613b2b60008301846135a9565b92915050565b6000608082019050613b4660008301876135a9565b613b5360208301866135a9565b613b606040830185613aa9565b8181036060830152613b7281846135d6565b905095945050505050565b6000604082019050613b9260008301856135a9565b613b9f6020830184613aa9565b9392505050565b6000602082019050613bbb60008301846135b8565b92915050565b6000602082019050613bd660008301846135c7565b92915050565b60006020820190508181036000830152613bf6818461360f565b905092915050565b60006020820190508181036000830152613c17816136f8565b9050919050565b60006020820190508181036000830152613c378161371b565b9050919050565b60006020820190508181036000830152613c578161373e565b9050919050565b60006020820190508181036000830152613c7781613761565b9050919050565b60006020820190508181036000830152613c9781613784565b9050919050565b60006020820190508181036000830152613cb7816137a7565b9050919050565b60006020820190508181036000830152613cd7816137ca565b9050919050565b60006020820190508181036000830152613cf7816137ed565b9050919050565b60006020820190508181036000830152613d1781613810565b9050919050565b60006020820190508181036000830152613d3781613833565b9050919050565b60006020820190508181036000830152613d5781613856565b9050919050565b60006020820190508181036000830152613d7781613879565b9050919050565b60006020820190508181036000830152613d978161389c565b9050919050565b60006020820190508181036000830152613db7816138bf565b9050919050565b60006020820190508181036000830152613dd7816138e2565b9050919050565b60006020820190508181036000830152613df781613905565b9050919050565b60006020820190508181036000830152613e1781613928565b9050919050565b60006020820190508181036000830152613e378161394b565b9050919050565b60006020820190508181036000830152613e578161396e565b9050919050565b60006020820190508181036000830152613e7781613991565b9050919050565b60006020820190508181036000830152613e97816139b4565b9050919050565b60006020820190508181036000830152613eb7816139d7565b9050919050565b60006020820190508181036000830152613ed781613a1d565b9050919050565b60006020820190508181036000830152613ef781613a40565b9050919050565b60006020820190508181036000830152613f1781613a86565b9050919050565b6000602082019050613f336000830184613aa9565b92915050565b6000613f43613f54565b9050613f4f8282614275565b919050565b6000604051905090565b600067ffffffffffffffff821115613f7957613f7861440b565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613fa557613fa461440b565b5b613fae82614453565b9050602081019050919050565b600067ffffffffffffffff821115613fd657613fd561440b565b5b613fdf82614453565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061404f826141cd565b915061405a836141cd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561408f5761408e614320565b5b828201905092915050565b60006140a5826141cd565b91506140b0836141cd565b9250826140c0576140bf61434f565b5b828204905092915050565b60006140d6826141cd565b91506140e1836141cd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561411a57614119614320565b5b828202905092915050565b6000614130826141cd565b915061413b836141cd565b92508282101561414e5761414d614320565b5b828203905092915050565b6000614164826141ad565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156142045780820151818401526020810190506141e9565b83811115614213576000848401525b50505050565b6000614224826141cd565b9150600082141561423857614237614320565b5b600182039050919050565b6000600282049050600182168061425b57607f821691505b6020821081141561426f5761426e61437e565b5b50919050565b61427e82614453565b810181811067ffffffffffffffff8211171561429d5761429c61440b565b5b80604052505050565b60006142b1826141cd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156142e4576142e3614320565b5b600182019050919050565b60006142fa826141cd565b9150614305836141cd565b9250826143155761431461434f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f53686f67756e3a2053686f67756e206973207374696c6c20627573792c20666960008201527f6e69736820796f75722061737369676e6d656e74206265666f7265207472616e60208201527f7366657272696e672e0000000000000000000000000000000000000000000000604082015250565b7f596f752063616e206f6e6c79206d696e742031204e465420706572207768697460008201527f656c697374656420616464726573730000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f596f7520616c7265616479207573656420796f75722077686974656c6973742060008201527f6d696e7420706173730000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f546f6b656e206e756d62657220746f206d696e742065786365656473206e756d60008201527f626572206f662077686974656c69737420746f6b656e73000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4d696e746572436f6e74726f6c3a206e6f7420612053484f47554e5f4d494e5460008201527f45525f524f4c4500000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4d696e746572436f6e74726f6c3a206e6f7420612053484f47554e5f4f574e4560008201527f525f524f4c450000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f53686f67756e3a2055524920717565727920666f72206e6f6e6578697374656e60008201527f7420746f6b656e00000000000000000000000000000000000000000000000000602082015250565b7f546f6b656e73206e756d62657220746f206d696e74206d75737420657863656560008201527f64206e756d626572206f66207075626c696320746f6b656e7300000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b614c0481614159565b8114614c0f57600080fd5b50565b614c1b8161416b565b8114614c2657600080fd5b50565b614c3281614177565b8114614c3d57600080fd5b50565b614c4981614181565b8114614c5457600080fd5b50565b614c60816141cd565b8114614c6b57600080fd5b5056fea2646970667358221220e7d6eb79e8012a0f28288693929659a29caaf3c0f1495be1ea190d196457917764736f6c63430008070033
Deployed ByteCode Sourcemap
56984:3274:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57564:237;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22252:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23811:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23334:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58268:300;;;:::i;:::-;;36483:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24561:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51796:123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56134:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52181:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56787:120;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36151:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56435:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53229:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57809:75;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57892:143;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24971:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55471:74;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36673:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59455:107;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60145:110;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21946:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57384:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21676:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59570:110;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58043:217;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50681:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22421:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49772:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24104:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56547:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56246:181;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25227:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58576:349;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52573:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56679:100;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24330:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55552:76;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57564:237;57674:4;57698:47;57733:11;57698:34;:47::i;:::-;:95;;;;57749:44;57781:11;57749:31;:44::i;:::-;57698:95;57691:102;;57564:237;;;:::o;22252:100::-;22306:13;22339:5;22332:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22252:100;:::o;23811:221::-;23887:7;23915:16;23923:7;23915;:16::i;:::-;23907:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24000:15;:24;24016:7;24000:24;;;;;;;;;;;;;;;;;;;;;23993:31;;23811:221;;;:::o;23334:411::-;23415:13;23431:23;23446:7;23431:14;:23::i;:::-;23415:39;;23479:5;23473:11;;:2;:11;;;;23465:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23573:5;23557:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23582:37;23599:5;23606:12;:10;:12::i;:::-;23582:16;:37::i;:::-;23557:62;23535:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23716:21;23725:2;23729:7;23716:8;:21::i;:::-;23404:341;23334:411;;:::o;58268:300::-;55829:22;55838:12;:10;:12::i;:::-;55829:8;:22::i;:::-;55821:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;58347:5:::1;58323:29;;:8;:20;58332:10;58323:20;;;;;;;;;;;;;;;;;;;;;;;;;:29;;;58315:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;58441:1;58417:21;58427:10;58417:9;:21::i;:::-;:25;58409:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;58505:17;58511:10;58505:5;:17::i;:::-;58556:4;58533:8;:20;58542:10;58533:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;58268:300::o:0;36483:113::-;36544:7;36571:10;:17;;;;36564:24;;36483:113;:::o;24561:339::-;24756:41;24775:12;:10;:12::i;:::-;24789:7;24756:18;:41::i;:::-;24748:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24864:28;24874:4;24880:2;24884:7;24864:9;:28::i;:::-;24561:339;;;:::o;51796:123::-;51862:7;51889:6;:12;51896:4;51889:12;;;;;;;;;;;:22;;;51882:29;;51796:123;;;:::o;56134:104::-;56192:38;55597:31;56222:7;56192:9;:38::i;:::-;56134:104;:::o;52181:147::-;52264:18;52277:4;52264:12;:18::i;:::-;50263:30;50274:4;50280:12;:10;:12::i;:::-;50263:10;:30::i;:::-;52295:25:::1;52306:4;52312:7;52295:10;:25::i;:::-;52181:147:::0;;;:::o;56787:120::-;56841:4;56865:34;55515:30;56892:6;56865:7;:34::i;:::-;56858:41;;56787:120;;;:::o;36151:256::-;36248:7;36284:23;36301:5;36284:16;:23::i;:::-;36276:5;:31;36268:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;36373:12;:19;36386:5;36373:19;;;;;;;;;;;;;;;:26;36393:5;36373:26;;;;;;;;;;;;36366:33;;36151:256;;;;:::o;56435:104::-;56492:39;55597:31;56523:7;56492:10;:39::i;:::-;56435:104;:::o;53229:218::-;53336:12;:10;:12::i;:::-;53325:23;;:7;:23;;;53317:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;53413:26;53425:4;53431:7;53413:11;:26::i;:::-;53229:218;;:::o;57809:75::-;55677:40;55515:30;55704:12;:10;:12::i;:::-;55677:7;:40::i;:::-;55669:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;57867:9:::1;57873:2;57867:5;:9::i;:::-;57809:75:::0;:::o;57892:143::-;55677:40;55515:30;55704:12;:10;:12::i;:::-;55677:7;:40::i;:::-;55669:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;57956:6:::1;57965:5;57956:14;;57952:76;57976:5;57972:1;:9;57952:76;;;57999:19;58012:2;58016:1;57999:12;:19::i;:::-;57983:3;;;;;:::i;:::-;;;;57952:76;;;;57892:143:::0;:::o;24971:185::-;25109:39;25126:4;25132:2;25136:7;25109:39;;;;;;;;;;;;:16;:39::i;:::-;24971:185;;;:::o;55471:74::-;55515:30;55471:74;:::o;36673:233::-;36748:7;36784:30;:28;:30::i;:::-;36776:5;:38;36768:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;36881:10;36892:5;36881:17;;;;;;;;:::i;:::-;;;;;;;;;;36874:24;;36673:233;;;:::o;59455:107::-;55677:40;55515:30;55704:12;:10;:12::i;:::-;55677:7;:40::i;:::-;55669:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;59550:4:::1;59525:12;:22;59538:8;59525:22;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;59455:107:::0;:::o;60145:110::-;55677:40;55515:30;55704:12;:10;:12::i;:::-;55677:7;:40::i;:::-;55669:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;60234:13:::1;60224:7;:23;;;;;;;;;;;;:::i;:::-;;60145:110:::0;:::o;21946:239::-;22018:7;22038:13;22054:7;:16;22062:7;22054:16;;;;;;;;;;;;;;;;;;;;;22038:32;;22106:1;22089:19;;:5;:19;;;;22081:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22172:5;22165:12;;;21946:239;;;:::o;57384:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21676:208::-;21748:7;21793:1;21776:19;;:5;:19;;;;21768:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21860:9;:16;21870:5;21860:16;;;;;;;;;;;;;;;;21853:23;;21676:208;;;:::o;59570:110::-;55677:40;55515:30;55704:12;:10;:12::i;:::-;55677:7;:40::i;:::-;55669:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;59667:5:::1;59642:12;:22;59655:8;59642:22;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;59570:110:::0;:::o;58043:217::-;55677:40;55515:30;55704:12;:10;:12::i;:::-;55677:7;:40::i;:::-;55669:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;57215:5:::1;58127:7;:29;58119:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;58227:25;58240:2;58244:7;58227:12;:25::i;:::-;58043:217:::0;;:::o;50681:139::-;50759:4;50783:6;:12;50790:4;50783:12;;;;;;;;;;;:20;;:29;50804:7;50783:29;;;;;;;;;;;;;;;;;;;;;;;;;50776:36;;50681:139;;;;:::o;22421:104::-;22477:13;22510:7;22503:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22421:104;:::o;49772:49::-;49817:4;49772:49;;;:::o;24104:155::-;24199:52;24218:12;:10;:12::i;:::-;24232:8;24242;24199:18;:52::i;:::-;24104:155;;:::o;56547:124::-;56603:4;56627:36;55597:31;56655:7;56627;:36::i;:::-;56620:43;;56547:124;;;:::o;56246:181::-;56319:6;56315:105;56335:7;:14;56331:1;:18;56315:105;;;56369:41;55597:31;56399:7;56407:1;56399:10;;;;;;;;:::i;:::-;;;;;;;;56369:9;:41::i;:::-;56351:3;;;;;:::i;:::-;;;;56315:105;;;;56246:181;:::o;25227:328::-;25402:41;25421:12;:10;:12::i;:::-;25435:7;25402:18;:41::i;:::-;25394:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25508:39;25522:4;25528:2;25532:7;25541:5;25508:13;:39::i;:::-;25227:328;;;;:::o;58576:349::-;58642:13;58676:17;58684:8;58676:7;:17::i;:::-;58668:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;58779:1;58761:7;58755:21;;;;;:::i;:::-;;;:25;:162;;;;;;;;;;;;;;;;;58838:7;58864:19;:8;:17;:19::i;:::-;58803:95;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58755:162;58748:169;;58576:349;;;:::o;52573:149::-;52657:18;52670:4;52657:12;:18::i;:::-;50263:30;50274:4;50280:12;:10;:12::i;:::-;50263:10;:30::i;:::-;52688:26:::1;52700:4;52706:7;52688:11;:26::i;:::-;52573:149:::0;;;:::o;56679:100::-;56735:36;55515:30;56764:6;56735:9;:36::i;:::-;56679:100;:::o;24330:164::-;24427:4;24451:18;:25;24470:5;24451:25;;;;;;;;;;;;;;;:35;24477:8;24451:35;;;;;;;;;;;;;;;;;;;;;;;;;24444:42;;24330:164;;;;:::o;55552:76::-;55597:31;55552:76;:::o;35843:224::-;35945:4;35984:35;35969:50;;;:11;:50;;;;:90;;;;36023:36;36047:11;36023:23;:36::i;:::-;35969:90;35962:97;;35843:224;;;:::o;50385:204::-;50470:4;50509:32;50494:47;;;:11;:47;;;;:87;;;;50545:36;50569:11;50545:23;:36::i;:::-;50494:87;50487:94;;50385:204;;;:::o;27065:127::-;27130:4;27182:1;27154:30;;:7;:16;27162:7;27154:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27147:37;;27065:127;;;:::o;16528:98::-;16581:7;16608:10;16601:17;;16528:98;:::o;31047:174::-;31149:2;31122:15;:24;31138:7;31122:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31205:7;31201:2;31167:46;;31176:23;31191:7;31176:14;:23::i;:::-;31167:46;;;;;;;;;;;;31047:174;;:::o;59087:360::-;59135:16;59173:25;:15;:23;:25::i;:::-;59162:36;;57215:5;59217:25;:15;:23;:25::i;:::-;:48;;59209:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;59336:27;:15;:25;:27::i;:::-;59379:25;59390:3;59395:8;59379:25;;;;;;;:::i;:::-;;;;;;;;59415:24;59425:3;59430:8;59415:9;:24::i;:::-;59124:323;59087:360;:::o;27359:348::-;27452:4;27477:16;27485:7;27477;:16::i;:::-;27469:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27553:13;27569:23;27584:7;27569:14;:23::i;:::-;27553:39;;27622:5;27611:16;;:7;:16;;;:51;;;;27655:7;27631:31;;:20;27643:7;27631:11;:20::i;:::-;:31;;;27611:51;:87;;;;27666:32;27683:5;27690:7;27666:16;:32::i;:::-;27611:87;27603:96;;;27359:348;;;;:::o;30351:578::-;30510:4;30483:31;;:23;30498:7;30483:14;:23::i;:::-;:31;;;30475:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30593:1;30579:16;;:2;:16;;;;30571:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30649:39;30670:4;30676:2;30680:7;30649:20;:39::i;:::-;30753:29;30770:1;30774:7;30753:8;:29::i;:::-;30814:1;30795:9;:15;30805:4;30795:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30843:1;30826:9;:13;30836:2;30826:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30874:2;30855:7;:16;30863:7;30855:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30913:7;30909:2;30894:27;;30903:4;30894:27;;;;;;;;;;;;30351:578;;;:::o;51110:497::-;51191:22;51199:4;51205:7;51191;:22::i;:::-;51186:414;;51379:41;51407:7;51379:41;;51417:2;51379:19;:41::i;:::-;51493:38;51521:4;51513:13;;51528:2;51493:19;:38::i;:::-;51284:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51230:358;;;;;;;;;;;:::i;:::-;;;;;;;;51186:414;51110:497;;:::o;54730:238::-;54814:22;54822:4;54828:7;54814;:22::i;:::-;54809:152;;54885:4;54853:6;:12;54860:4;54853:12;;;;;;;;;;;:20;;:29;54874:7;54853:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;54936:12;:10;:12::i;:::-;54909:40;;54927:7;54909:40;;54921:4;54909:40;;;;;;;;;;54809:152;54730:238;;:::o;55100:239::-;55184:22;55192:4;55198:7;55184;:22::i;:::-;55180:152;;;55255:5;55223:6;:12;55230:4;55223:12;;;;;;;;;;;:20;;:29;55244:7;55223:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;55307:12;:10;:12::i;:::-;55280:40;;55298:7;55280:40;;55292:4;55280:40;;;;;;;;;;55180:152;55100:239;;:::o;58933:146::-;59011:25;59022:3;59027:8;59011:25;;;;;;;:::i;:::-;;;;;;;;59047:24;59057:3;59062:8;59047:9;:24::i;:::-;58933:146;;:::o;31363:315::-;31518:8;31509:17;;:5;:17;;;;31501:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;31605:8;31567:18;:25;31586:5;31567:25;;;;;;;;;;;;;;;:35;31593:8;31567:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;31651:8;31629:41;;31644:5;31629:41;;;31661:8;31629:41;;;;;;:::i;:::-;;;;;;;;31363:315;;;:::o;26437:::-;26594:28;26604:4;26610:2;26614:7;26594:9;:28::i;:::-;26641:48;26664:4;26670:2;26674:7;26683:5;26641:22;:48::i;:::-;26633:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26437:315;;;;:::o;17115:723::-;17171:13;17401:1;17392:5;:10;17388:53;;;17419:10;;;;;;;;;;;;;;;;;;;;;17388:53;17451:12;17466:5;17451:20;;17482:14;17507:78;17522:1;17514:4;:9;17507:78;;17540:8;;;;;:::i;:::-;;;;17571:2;17563:10;;;;;:::i;:::-;;;17507:78;;;17595:19;17627:6;17617:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17595:39;;17645:154;17661:1;17652:5;:10;17645:154;;17689:1;17679:11;;;;;:::i;:::-;;;17756:2;17748:5;:10;;;;:::i;:::-;17735:2;:24;;;;:::i;:::-;17722:39;;17705:6;17712;17705:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17785:2;17776:11;;;;;:::i;:::-;;;17645:154;;;17823:6;17809:21;;;;;17115:723;;;;:::o;21307:305::-;21409:4;21461:25;21446:40;;;:11;:40;;;;:105;;;;21518:33;21503:48;;;:11;:48;;;;21446:105;:158;;;;21568:36;21592:11;21568:23;:36::i;:::-;21446:158;21426:178;;21307:305;;;:::o;19745:157::-;19830:4;19869:25;19854:40;;;:11;:40;;;;19847:47;;19745:157;;;:::o;44161:114::-;44226:7;44253;:14;;;44246:21;;44161:114;;;:::o;44283:127::-;44390:1;44372:7;:14;;;:19;;;;;;;;;;;44283:127;:::o;28049:110::-;28125:26;28135:2;28139:7;28125:26;;;;;;;;;;;;:9;:26::i;:::-;28049:110;;:::o;59688:323::-;59827:48;59854:5;59861:3;59866:8;59827:26;:48::i;:::-;59920:5;59894:31;;:12;:22;59907:8;59894:22;;;;;;;;;;;;;;;;;;;;;:31;;;59886:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;59688:323;;;:::o;18416:451::-;18491:13;18517:19;18562:1;18553:6;18549:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;18539:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18517:47;;18575:15;:6;18582:1;18575:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;18601;:6;18608:1;18601:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;18632:9;18657:1;18648:6;18644:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;18632:26;;18627:135;18664:1;18660;:5;18627:135;;;18699:12;18720:3;18712:5;:11;18699:25;;;;;;;:::i;:::-;;;;;18687:6;18694:1;18687:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;18749:1;18739:11;;;;;18667:3;;;;:::i;:::-;;;18627:135;;;;18789:1;18780:5;:10;18772:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;18852:6;18838:21;;;18416:451;;;;:::o;32243:799::-;32398:4;32419:15;:2;:13;;;:15::i;:::-;32415:620;;;32471:2;32455:36;;;32492:12;:10;:12::i;:::-;32506:4;32512:7;32521:5;32455:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32451:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32714:1;32697:6;:13;:18;32693:272;;;32740:60;;;;;;;;;;:::i;:::-;;;;;;;;32693:272;32915:6;32909:13;32900:6;32896:2;32892:15;32885:38;32451:529;32588:41;;;32578:51;;;:6;:51;;;;32571:58;;;;;32415:620;33019:4;33012:11;;32243:799;;;;;;;:::o;28386:321::-;28516:18;28522:2;28526:7;28516:5;:18::i;:::-;28567:54;28598:1;28602:2;28606:7;28615:5;28567:22;:54::i;:::-;28545:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;28386:321;;;:::o;37519:589::-;37663:45;37690:4;37696:2;37700:7;37663:26;:45::i;:::-;37741:1;37725:18;;:4;:18;;;37721:187;;;37760:40;37792:7;37760:31;:40::i;:::-;37721:187;;;37830:2;37822:10;;:4;:10;;;37818:90;;37849:47;37882:4;37888:7;37849:32;:47::i;:::-;37818:90;37721:187;37936:1;37922:16;;:2;:16;;;37918:183;;;37955:45;37992:7;37955:36;:45::i;:::-;37918:183;;;38028:4;38022:10;;:2;:10;;;38018:83;;38049:40;38077:2;38081:7;38049:27;:40::i;:::-;38018:83;37918:183;37519:589;;;:::o;8510:387::-;8570:4;8778:12;8845:7;8833:20;8825:28;;8888:1;8881:4;:8;8874:15;;;8510:387;;;:::o;29043:382::-;29137:1;29123:16;;:2;:16;;;;29115:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29196:16;29204:7;29196;:16::i;:::-;29195:17;29187:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29258:45;29287:1;29291:2;29295:7;29258:20;:45::i;:::-;29333:1;29316:9;:13;29326:2;29316:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29364:2;29345:7;:16;29353:7;29345:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29409:7;29405:2;29384:33;;29401:1;29384:33;;;;;;;;;;;;29043:382;;:::o;33614:126::-;;;;:::o;38831:164::-;38935:10;:17;;;;38908:15;:24;38924:7;38908:24;;;;;;;;;;;:44;;;;38963:10;38979:7;38963:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38831:164;:::o;39622:988::-;39888:22;39938:1;39913:22;39930:4;39913:16;:22::i;:::-;:26;;;;:::i;:::-;39888:51;;39950:18;39971:17;:26;39989:7;39971:26;;;;;;;;;;;;39950:47;;40118:14;40104:10;:28;40100:328;;40149:19;40171:12;:18;40184:4;40171:18;;;;;;;;;;;;;;;:34;40190:14;40171:34;;;;;;;;;;;;40149:56;;40255:11;40222:12;:18;40235:4;40222:18;;;;;;;;;;;;;;;:30;40241:10;40222:30;;;;;;;;;;;:44;;;;40372:10;40339:17;:30;40357:11;40339:30;;;;;;;;;;;:43;;;;40134:294;40100:328;40524:17;:26;40542:7;40524:26;;;;;;;;;;;40517:33;;;40568:12;:18;40581:4;40568:18;;;;;;;;;;;;;;;:34;40587:14;40568:34;;;;;;;;;;;40561:41;;;39703:907;;39622:988;;:::o;40905:1079::-;41158:22;41203:1;41183:10;:17;;;;:21;;;;:::i;:::-;41158:46;;41215:18;41236:15;:24;41252:7;41236:24;;;;;;;;;;;;41215:45;;41587:19;41609:10;41620:14;41609:26;;;;;;;;:::i;:::-;;;;;;;;;;41587:48;;41673:11;41648:10;41659;41648:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;41784:10;41753:15;:28;41769:11;41753:28;;;;;;;;;;;:41;;;;41925:15;:24;41941:7;41925:24;;;;;;;;;;;41918:31;;;41960:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;40976:1008;;;40905:1079;:::o;38409:221::-;38494:14;38511:20;38528:2;38511:16;:20::i;:::-;38494:37;;38569:7;38542:12;:16;38555:2;38542:16;;;;;;;;;;;;;;;:24;38559:6;38542:24;;;;;;;;;;;:34;;;;38616:6;38587:17;:26;38605:7;38587:26;;;;;;;;;;;:35;;;;38483:147;38409:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:370::-;1819:5;1868:3;1861:4;1853:6;1849:17;1845:27;1835:122;;1876:79;;:::i;:::-;1835:122;1993:6;1980:20;2018:94;2108:3;2100:6;2093:4;2085:6;2081:17;2018:94;:::i;:::-;2009:103;;1825:293;1748:370;;;;:::o;2124:133::-;2167:5;2205:6;2192:20;2183:29;;2221:30;2245:5;2221:30;:::i;:::-;2124:133;;;;:::o;2263:139::-;2309:5;2347:6;2334:20;2325:29;;2363:33;2390:5;2363:33;:::i;:::-;2263:139;;;;:::o;2408:137::-;2453:5;2491:6;2478:20;2469:29;;2507:32;2533:5;2507:32;:::i;:::-;2408:137;;;;:::o;2551:141::-;2607:5;2638:6;2632:13;2623:22;;2654:32;2680:5;2654:32;:::i;:::-;2551:141;;;;:::o;2711:338::-;2766:5;2815:3;2808:4;2800:6;2796:17;2792:27;2782:122;;2823:79;;:::i;:::-;2782:122;2940:6;2927:20;2965:78;3039:3;3031:6;3024:4;3016:6;3012:17;2965:78;:::i;:::-;2956:87;;2772:277;2711:338;;;;:::o;3069:340::-;3125:5;3174:3;3167:4;3159:6;3155:17;3151:27;3141:122;;3182:79;;:::i;:::-;3141:122;3299:6;3286:20;3324:79;3399:3;3391:6;3384:4;3376:6;3372:17;3324:79;:::i;:::-;3315:88;;3131:278;3069:340;;;;:::o;3415:139::-;3461:5;3499:6;3486:20;3477:29;;3515:33;3542:5;3515:33;:::i;:::-;3415:139;;;;:::o;3560:329::-;3619:6;3668:2;3656:9;3647:7;3643:23;3639:32;3636:119;;;3674:79;;:::i;:::-;3636:119;3794:1;3819:53;3864:7;3855:6;3844:9;3840:22;3819:53;:::i;:::-;3809:63;;3765:117;3560:329;;;;:::o;3895:474::-;3963:6;3971;4020:2;4008:9;3999:7;3995:23;3991:32;3988:119;;;4026:79;;:::i;:::-;3988:119;4146:1;4171:53;4216:7;4207:6;4196:9;4192:22;4171:53;:::i;:::-;4161:63;;4117:117;4273:2;4299:53;4344:7;4335:6;4324:9;4320:22;4299:53;:::i;:::-;4289:63;;4244:118;3895:474;;;;;:::o;4375:619::-;4452:6;4460;4468;4517:2;4505:9;4496:7;4492:23;4488:32;4485:119;;;4523:79;;:::i;:::-;4485:119;4643:1;4668:53;4713:7;4704:6;4693:9;4689:22;4668:53;:::i;:::-;4658:63;;4614:117;4770:2;4796:53;4841:7;4832:6;4821:9;4817:22;4796:53;:::i;:::-;4786:63;;4741:118;4898:2;4924:53;4969:7;4960:6;4949:9;4945:22;4924:53;:::i;:::-;4914:63;;4869:118;4375:619;;;;;:::o;5000:943::-;5095:6;5103;5111;5119;5168:3;5156:9;5147:7;5143:23;5139:33;5136:120;;;5175:79;;:::i;:::-;5136:120;5295:1;5320:53;5365:7;5356:6;5345:9;5341:22;5320:53;:::i;:::-;5310:63;;5266:117;5422:2;5448:53;5493:7;5484:6;5473:9;5469:22;5448:53;:::i;:::-;5438:63;;5393:118;5550:2;5576:53;5621:7;5612:6;5601:9;5597:22;5576:53;:::i;:::-;5566:63;;5521:118;5706:2;5695:9;5691:18;5678:32;5737:18;5729:6;5726:30;5723:117;;;5759:79;;:::i;:::-;5723:117;5864:62;5918:7;5909:6;5898:9;5894:22;5864:62;:::i;:::-;5854:72;;5649:287;5000:943;;;;;;;:::o;5949:468::-;6014:6;6022;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:53;6267:7;6258:6;6247:9;6243:22;6222:53;:::i;:::-;6212:63;;6168:117;6324:2;6350:50;6392:7;6383:6;6372:9;6368:22;6350:50;:::i;:::-;6340:60;;6295:115;5949:468;;;;;:::o;6423:474::-;6491:6;6499;6548:2;6536:9;6527:7;6523:23;6519:32;6516:119;;;6554:79;;:::i;:::-;6516:119;6674:1;6699:53;6744:7;6735:6;6724:9;6720:22;6699:53;:::i;:::-;6689:63;;6645:117;6801:2;6827:53;6872:7;6863:6;6852:9;6848:22;6827:53;:::i;:::-;6817:63;;6772:118;6423:474;;;;;:::o;6903:539::-;6987:6;7036:2;7024:9;7015:7;7011:23;7007:32;7004:119;;;7042:79;;:::i;:::-;7004:119;7190:1;7179:9;7175:17;7162:31;7220:18;7212:6;7209:30;7206:117;;;7242:79;;:::i;:::-;7206:117;7347:78;7417:7;7408:6;7397:9;7393:22;7347:78;:::i;:::-;7337:88;;7133:302;6903:539;;;;:::o;7448:329::-;7507:6;7556:2;7544:9;7535:7;7531:23;7527:32;7524:119;;;7562:79;;:::i;:::-;7524:119;7682:1;7707:53;7752:7;7743:6;7732:9;7728:22;7707:53;:::i;:::-;7697:63;;7653:117;7448:329;;;;:::o;7783:474::-;7851:6;7859;7908:2;7896:9;7887:7;7883:23;7879:32;7876:119;;;7914:79;;:::i;:::-;7876:119;8034:1;8059:53;8104:7;8095:6;8084:9;8080:22;8059:53;:::i;:::-;8049:63;;8005:117;8161:2;8187:53;8232:7;8223:6;8212:9;8208:22;8187:53;:::i;:::-;8177:63;;8132:118;7783:474;;;;;:::o;8263:327::-;8321:6;8370:2;8358:9;8349:7;8345:23;8341:32;8338:119;;;8376:79;;:::i;:::-;8338:119;8496:1;8521:52;8565:7;8556:6;8545:9;8541:22;8521:52;:::i;:::-;8511:62;;8467:116;8263:327;;;;:::o;8596:349::-;8665:6;8714:2;8702:9;8693:7;8689:23;8685:32;8682:119;;;8720:79;;:::i;:::-;8682:119;8840:1;8865:63;8920:7;8911:6;8900:9;8896:22;8865:63;:::i;:::-;8855:73;;8811:127;8596:349;;;;:::o;8951:509::-;9020:6;9069:2;9057:9;9048:7;9044:23;9040:32;9037:119;;;9075:79;;:::i;:::-;9037:119;9223:1;9212:9;9208:17;9195:31;9253:18;9245:6;9242:30;9239:117;;;9275:79;;:::i;:::-;9239:117;9380:63;9435:7;9426:6;9415:9;9411:22;9380:63;:::i;:::-;9370:73;;9166:287;8951:509;;;;:::o;9466:329::-;9525:6;9574:2;9562:9;9553:7;9549:23;9545:32;9542:119;;;9580:79;;:::i;:::-;9542:119;9700:1;9725:53;9770:7;9761:6;9750:9;9746:22;9725:53;:::i;:::-;9715:63;;9671:117;9466:329;;;;:::o;9801:118::-;9888:24;9906:5;9888:24;:::i;:::-;9883:3;9876:37;9801:118;;:::o;9925:109::-;10006:21;10021:5;10006:21;:::i;:::-;10001:3;9994:34;9925:109;;:::o;10040:118::-;10127:24;10145:5;10127:24;:::i;:::-;10122:3;10115:37;10040:118;;:::o;10164:360::-;10250:3;10278:38;10310:5;10278:38;:::i;:::-;10332:70;10395:6;10390:3;10332:70;:::i;:::-;10325:77;;10411:52;10456:6;10451:3;10444:4;10437:5;10433:16;10411:52;:::i;:::-;10488:29;10510:6;10488:29;:::i;:::-;10483:3;10479:39;10472:46;;10254:270;10164:360;;;;:::o;10530:364::-;10618:3;10646:39;10679:5;10646:39;:::i;:::-;10701:71;10765:6;10760:3;10701:71;:::i;:::-;10694:78;;10781:52;10826:6;10821:3;10814:4;10807:5;10803:16;10781:52;:::i;:::-;10858:29;10880:6;10858:29;:::i;:::-;10853:3;10849:39;10842:46;;10622:272;10530:364;;;;:::o;10900:377::-;11006:3;11034:39;11067:5;11034:39;:::i;:::-;11089:89;11171:6;11166:3;11089:89;:::i;:::-;11082:96;;11187:52;11232:6;11227:3;11220:4;11213:5;11209:16;11187:52;:::i;:::-;11264:6;11259:3;11255:16;11248:23;;11010:267;10900:377;;;;:::o;11307:845::-;11410:3;11447:5;11441:12;11476:36;11502:9;11476:36;:::i;:::-;11528:89;11610:6;11605:3;11528:89;:::i;:::-;11521:96;;11648:1;11637:9;11633:17;11664:1;11659:137;;;;11810:1;11805:341;;;;11626:520;;11659:137;11743:4;11739:9;11728;11724:25;11719:3;11712:38;11779:6;11774:3;11770:16;11763:23;;11659:137;;11805:341;11872:38;11904:5;11872:38;:::i;:::-;11932:1;11946:154;11960:6;11957:1;11954:13;11946:154;;;12034:7;12028:14;12024:1;12019:3;12015:11;12008:35;12084:1;12075:7;12071:15;12060:26;;11982:4;11979:1;11975:12;11970:17;;11946:154;;;12129:6;12124:3;12120:16;12113:23;;11812:334;;11626:520;;11414:738;;11307:845;;;;:::o;12158:366::-;12300:3;12321:67;12385:2;12380:3;12321:67;:::i;:::-;12314:74;;12397:93;12486:3;12397:93;:::i;:::-;12515:2;12510:3;12506:12;12499:19;;12158:366;;;:::o;12530:::-;12672:3;12693:67;12757:2;12752:3;12693:67;:::i;:::-;12686:74;;12769:93;12858:3;12769:93;:::i;:::-;12887:2;12882:3;12878:12;12871:19;;12530:366;;;:::o;12902:::-;13044:3;13065:67;13129:2;13124:3;13065:67;:::i;:::-;13058:74;;13141:93;13230:3;13141:93;:::i;:::-;13259:2;13254:3;13250:12;13243:19;;12902:366;;;:::o;13274:::-;13416:3;13437:67;13501:2;13496:3;13437:67;:::i;:::-;13430:74;;13513:93;13602:3;13513:93;:::i;:::-;13631:2;13626:3;13622:12;13615:19;;13274:366;;;:::o;13646:::-;13788:3;13809:67;13873:2;13868:3;13809:67;:::i;:::-;13802:74;;13885:93;13974:3;13885:93;:::i;:::-;14003:2;13998:3;13994:12;13987:19;;13646:366;;;:::o;14018:::-;14160:3;14181:67;14245:2;14240:3;14181:67;:::i;:::-;14174:74;;14257:93;14346:3;14257:93;:::i;:::-;14375:2;14370:3;14366:12;14359:19;;14018:366;;;:::o;14390:::-;14532:3;14553:67;14617:2;14612:3;14553:67;:::i;:::-;14546:74;;14629:93;14718:3;14629:93;:::i;:::-;14747:2;14742:3;14738:12;14731:19;;14390:366;;;:::o;14762:::-;14904:3;14925:67;14989:2;14984:3;14925:67;:::i;:::-;14918:74;;15001:93;15090:3;15001:93;:::i;:::-;15119:2;15114:3;15110:12;15103:19;;14762:366;;;:::o;15134:::-;15276:3;15297:67;15361:2;15356:3;15297:67;:::i;:::-;15290:74;;15373:93;15462:3;15373:93;:::i;:::-;15491:2;15486:3;15482:12;15475:19;;15134:366;;;:::o;15506:::-;15648:3;15669:67;15733:2;15728:3;15669:67;:::i;:::-;15662:74;;15745:93;15834:3;15745:93;:::i;:::-;15863:2;15858:3;15854:12;15847:19;;15506:366;;;:::o;15878:::-;16020:3;16041:67;16105:2;16100:3;16041:67;:::i;:::-;16034:74;;16117:93;16206:3;16117:93;:::i;:::-;16235:2;16230:3;16226:12;16219:19;;15878:366;;;:::o;16250:::-;16392:3;16413:67;16477:2;16472:3;16413:67;:::i;:::-;16406:74;;16489:93;16578:3;16489:93;:::i;:::-;16607:2;16602:3;16598:12;16591:19;;16250:366;;;:::o;16622:::-;16764:3;16785:67;16849:2;16844:3;16785:67;:::i;:::-;16778:74;;16861:93;16950:3;16861:93;:::i;:::-;16979:2;16974:3;16970:12;16963:19;;16622:366;;;:::o;16994:::-;17136:3;17157:67;17221:2;17216:3;17157:67;:::i;:::-;17150:74;;17233:93;17322:3;17233:93;:::i;:::-;17351:2;17346:3;17342:12;17335:19;;16994:366;;;:::o;17366:::-;17508:3;17529:67;17593:2;17588:3;17529:67;:::i;:::-;17522:74;;17605:93;17694:3;17605:93;:::i;:::-;17723:2;17718:3;17714:12;17707:19;;17366:366;;;:::o;17738:::-;17880:3;17901:67;17965:2;17960:3;17901:67;:::i;:::-;17894:74;;17977:93;18066:3;17977:93;:::i;:::-;18095:2;18090:3;18086:12;18079:19;;17738:366;;;:::o;18110:::-;18252:3;18273:67;18337:2;18332:3;18273:67;:::i;:::-;18266:74;;18349:93;18438:3;18349:93;:::i;:::-;18467:2;18462:3;18458:12;18451:19;;18110:366;;;:::o;18482:::-;18624:3;18645:67;18709:2;18704:3;18645:67;:::i;:::-;18638:74;;18721:93;18810:3;18721:93;:::i;:::-;18839:2;18834:3;18830:12;18823:19;;18482:366;;;:::o;18854:::-;18996:3;19017:67;19081:2;19076:3;19017:67;:::i;:::-;19010:74;;19093:93;19182:3;19093:93;:::i;:::-;19211:2;19206:3;19202:12;19195:19;;18854:366;;;:::o;19226:::-;19368:3;19389:67;19453:2;19448:3;19389:67;:::i;:::-;19382:74;;19465:93;19554:3;19465:93;:::i;:::-;19583:2;19578:3;19574:12;19567:19;;19226:366;;;:::o;19598:::-;19740:3;19761:67;19825:2;19820:3;19761:67;:::i;:::-;19754:74;;19837:93;19926:3;19837:93;:::i;:::-;19955:2;19950:3;19946:12;19939:19;;19598:366;;;:::o;19970:::-;20112:3;20133:67;20197:2;20192:3;20133:67;:::i;:::-;20126:74;;20209:93;20298:3;20209:93;:::i;:::-;20327:2;20322:3;20318:12;20311:19;;19970:366;;;:::o;20342:402::-;20502:3;20523:85;20605:2;20600:3;20523:85;:::i;:::-;20516:92;;20617:93;20706:3;20617:93;:::i;:::-;20735:2;20730:3;20726:12;20719:19;;20342:402;;;:::o;20750:366::-;20892:3;20913:67;20977:2;20972:3;20913:67;:::i;:::-;20906:74;;20989:93;21078:3;20989:93;:::i;:::-;21107:2;21102:3;21098:12;21091:19;;20750:366;;;:::o;21122:::-;21264:3;21285:67;21349:2;21344:3;21285:67;:::i;:::-;21278:74;;21361:93;21450:3;21361:93;:::i;:::-;21479:2;21474:3;21470:12;21463:19;;21122:366;;;:::o;21494:402::-;21654:3;21675:85;21757:2;21752:3;21675:85;:::i;:::-;21668:92;;21769:93;21858:3;21769:93;:::i;:::-;21887:2;21882:3;21878:12;21871:19;;21494:402;;;:::o;21902:366::-;22044:3;22065:67;22129:2;22124:3;22065:67;:::i;:::-;22058:74;;22141:93;22230:3;22141:93;:::i;:::-;22259:2;22254:3;22250:12;22243:19;;21902:366;;;:::o;22274:118::-;22361:24;22379:5;22361:24;:::i;:::-;22356:3;22349:37;22274:118;;:::o;22398:429::-;22575:3;22597:92;22685:3;22676:6;22597:92;:::i;:::-;22590:99;;22706:95;22797:3;22788:6;22706:95;:::i;:::-;22699:102;;22818:3;22811:10;;22398:429;;;;;:::o;22833:967::-;23215:3;23237:148;23381:3;23237:148;:::i;:::-;23230:155;;23402:95;23493:3;23484:6;23402:95;:::i;:::-;23395:102;;23514:148;23658:3;23514:148;:::i;:::-;23507:155;;23679:95;23770:3;23761:6;23679:95;:::i;:::-;23672:102;;23791:3;23784:10;;22833:967;;;;;:::o;23806:222::-;23899:4;23937:2;23926:9;23922:18;23914:26;;23950:71;24018:1;24007:9;24003:17;23994:6;23950:71;:::i;:::-;23806:222;;;;:::o;24034:640::-;24229:4;24267:3;24256:9;24252:19;24244:27;;24281:71;24349:1;24338:9;24334:17;24325:6;24281:71;:::i;:::-;24362:72;24430:2;24419:9;24415:18;24406:6;24362:72;:::i;:::-;24444;24512:2;24501:9;24497:18;24488:6;24444:72;:::i;:::-;24563:9;24557:4;24553:20;24548:2;24537:9;24533:18;24526:48;24591:76;24662:4;24653:6;24591:76;:::i;:::-;24583:84;;24034:640;;;;;;;:::o;24680:332::-;24801:4;24839:2;24828:9;24824:18;24816:26;;24852:71;24920:1;24909:9;24905:17;24896:6;24852:71;:::i;:::-;24933:72;25001:2;24990:9;24986:18;24977:6;24933:72;:::i;:::-;24680:332;;;;;:::o;25018:210::-;25105:4;25143:2;25132:9;25128:18;25120:26;;25156:65;25218:1;25207:9;25203:17;25194:6;25156:65;:::i;:::-;25018:210;;;;:::o;25234:222::-;25327:4;25365:2;25354:9;25350:18;25342:26;;25378:71;25446:1;25435:9;25431:17;25422:6;25378:71;:::i;:::-;25234:222;;;;:::o;25462:313::-;25575:4;25613:2;25602:9;25598:18;25590:26;;25662:9;25656:4;25652:20;25648:1;25637:9;25633:17;25626:47;25690:78;25763:4;25754:6;25690:78;:::i;:::-;25682:86;;25462:313;;;;:::o;25781:419::-;25947:4;25985:2;25974:9;25970:18;25962:26;;26034:9;26028:4;26024:20;26020:1;26009:9;26005:17;25998:47;26062:131;26188:4;26062:131;:::i;:::-;26054:139;;25781:419;;;:::o;26206:::-;26372:4;26410:2;26399:9;26395:18;26387:26;;26459:9;26453:4;26449:20;26445:1;26434:9;26430:17;26423:47;26487:131;26613:4;26487:131;:::i;:::-;26479:139;;26206:419;;;:::o;26631:::-;26797:4;26835:2;26824:9;26820:18;26812:26;;26884:9;26878:4;26874:20;26870:1;26859:9;26855:17;26848:47;26912:131;27038:4;26912:131;:::i;:::-;26904:139;;26631:419;;;:::o;27056:::-;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:131;27463:4;27337:131;:::i;:::-;27329:139;;27056:419;;;:::o;27481:::-;27647:4;27685:2;27674:9;27670:18;27662:26;;27734:9;27728:4;27724:20;27720:1;27709:9;27705:17;27698:47;27762:131;27888:4;27762:131;:::i;:::-;27754:139;;27481:419;;;:::o;27906:::-;28072:4;28110:2;28099:9;28095:18;28087:26;;28159:9;28153:4;28149:20;28145:1;28134:9;28130:17;28123:47;28187:131;28313:4;28187:131;:::i;:::-;28179:139;;27906:419;;;:::o;28331:::-;28497:4;28535:2;28524:9;28520:18;28512:26;;28584:9;28578:4;28574:20;28570:1;28559:9;28555:17;28548:47;28612:131;28738:4;28612:131;:::i;:::-;28604:139;;28331:419;;;:::o;28756:::-;28922:4;28960:2;28949:9;28945:18;28937:26;;29009:9;29003:4;28999:20;28995:1;28984:9;28980:17;28973:47;29037:131;29163:4;29037:131;:::i;:::-;29029:139;;28756:419;;;:::o;29181:::-;29347:4;29385:2;29374:9;29370:18;29362:26;;29434:9;29428:4;29424:20;29420:1;29409:9;29405:17;29398:47;29462:131;29588:4;29462:131;:::i;:::-;29454:139;;29181:419;;;:::o;29606:::-;29772:4;29810:2;29799:9;29795:18;29787:26;;29859:9;29853:4;29849:20;29845:1;29834:9;29830:17;29823:47;29887:131;30013:4;29887:131;:::i;:::-;29879:139;;29606:419;;;:::o;30031:::-;30197:4;30235:2;30224:9;30220:18;30212:26;;30284:9;30278:4;30274:20;30270:1;30259:9;30255:17;30248:47;30312:131;30438:4;30312:131;:::i;:::-;30304:139;;30031:419;;;:::o;30456:::-;30622:4;30660:2;30649:9;30645:18;30637:26;;30709:9;30703:4;30699:20;30695:1;30684:9;30680:17;30673:47;30737:131;30863:4;30737:131;:::i;:::-;30729:139;;30456:419;;;:::o;30881:::-;31047:4;31085:2;31074:9;31070:18;31062:26;;31134:9;31128:4;31124:20;31120:1;31109:9;31105:17;31098:47;31162:131;31288:4;31162:131;:::i;:::-;31154:139;;30881:419;;;:::o;31306:::-;31472:4;31510:2;31499:9;31495:18;31487:26;;31559:9;31553:4;31549:20;31545:1;31534:9;31530:17;31523:47;31587:131;31713:4;31587:131;:::i;:::-;31579:139;;31306:419;;;:::o;31731:::-;31897:4;31935:2;31924:9;31920:18;31912:26;;31984:9;31978:4;31974:20;31970:1;31959:9;31955:17;31948:47;32012:131;32138:4;32012:131;:::i;:::-;32004:139;;31731:419;;;:::o;32156:::-;32322:4;32360:2;32349:9;32345:18;32337:26;;32409:9;32403:4;32399:20;32395:1;32384:9;32380:17;32373:47;32437:131;32563:4;32437:131;:::i;:::-;32429:139;;32156:419;;;:::o;32581:::-;32747:4;32785:2;32774:9;32770:18;32762:26;;32834:9;32828:4;32824:20;32820:1;32809:9;32805:17;32798:47;32862:131;32988:4;32862:131;:::i;:::-;32854:139;;32581:419;;;:::o;33006:::-;33172:4;33210:2;33199:9;33195:18;33187:26;;33259:9;33253:4;33249:20;33245:1;33234:9;33230:17;33223:47;33287:131;33413:4;33287:131;:::i;:::-;33279:139;;33006:419;;;:::o;33431:::-;33597:4;33635:2;33624:9;33620:18;33612:26;;33684:9;33678:4;33674:20;33670:1;33659:9;33655:17;33648:47;33712:131;33838:4;33712:131;:::i;:::-;33704:139;;33431:419;;;:::o;33856:::-;34022:4;34060:2;34049:9;34045:18;34037:26;;34109:9;34103:4;34099:20;34095:1;34084:9;34080:17;34073:47;34137:131;34263:4;34137:131;:::i;:::-;34129:139;;33856:419;;;:::o;34281:::-;34447:4;34485:2;34474:9;34470:18;34462:26;;34534:9;34528:4;34524:20;34520:1;34509:9;34505:17;34498:47;34562:131;34688:4;34562:131;:::i;:::-;34554:139;;34281:419;;;:::o;34706:::-;34872:4;34910:2;34899:9;34895:18;34887:26;;34959:9;34953:4;34949:20;34945:1;34934:9;34930:17;34923:47;34987:131;35113:4;34987:131;:::i;:::-;34979:139;;34706:419;;;:::o;35131:::-;35297:4;35335:2;35324:9;35320:18;35312:26;;35384:9;35378:4;35374:20;35370:1;35359:9;35355:17;35348:47;35412:131;35538:4;35412:131;:::i;:::-;35404:139;;35131:419;;;:::o;35556:::-;35722:4;35760:2;35749:9;35745:18;35737:26;;35809:9;35803:4;35799:20;35795:1;35784:9;35780:17;35773:47;35837:131;35963:4;35837:131;:::i;:::-;35829:139;;35556:419;;;:::o;35981:::-;36147:4;36185:2;36174:9;36170:18;36162:26;;36234:9;36228:4;36224:20;36220:1;36209:9;36205:17;36198:47;36262:131;36388:4;36262:131;:::i;:::-;36254:139;;35981:419;;;:::o;36406:222::-;36499:4;36537:2;36526:9;36522:18;36514:26;;36550:71;36618:1;36607:9;36603:17;36594:6;36550:71;:::i;:::-;36406:222;;;;:::o;36634:129::-;36668:6;36695:20;;:::i;:::-;36685:30;;36724:33;36752:4;36744:6;36724:33;:::i;:::-;36634:129;;;:::o;36769:75::-;36802:6;36835:2;36829:9;36819:19;;36769:75;:::o;36850:311::-;36927:4;37017:18;37009:6;37006:30;37003:56;;;37039:18;;:::i;:::-;37003:56;37089:4;37081:6;37077:17;37069:25;;37149:4;37143;37139:15;37131:23;;36850:311;;;:::o;37167:307::-;37228:4;37318:18;37310:6;37307:30;37304:56;;;37340:18;;:::i;:::-;37304:56;37378:29;37400:6;37378:29;:::i;:::-;37370:37;;37462:4;37456;37452:15;37444:23;;37167:307;;;:::o;37480:308::-;37542:4;37632:18;37624:6;37621:30;37618:56;;;37654:18;;:::i;:::-;37618:56;37692:29;37714:6;37692:29;:::i;:::-;37684:37;;37776:4;37770;37766:15;37758:23;;37480:308;;;:::o;37794:141::-;37843:4;37866:3;37858:11;;37889:3;37886:1;37879:14;37923:4;37920:1;37910:18;37902:26;;37794:141;;;:::o;37941:98::-;37992:6;38026:5;38020:12;38010:22;;37941:98;;;:::o;38045:99::-;38097:6;38131:5;38125:12;38115:22;;38045:99;;;:::o;38150:168::-;38233:11;38267:6;38262:3;38255:19;38307:4;38302:3;38298:14;38283:29;;38150:168;;;;:::o;38324:169::-;38408:11;38442:6;38437:3;38430:19;38482:4;38477:3;38473:14;38458:29;;38324:169;;;;:::o;38499:148::-;38601:11;38638:3;38623:18;;38499:148;;;;:::o;38653:305::-;38693:3;38712:20;38730:1;38712:20;:::i;:::-;38707:25;;38746:20;38764:1;38746:20;:::i;:::-;38741:25;;38900:1;38832:66;38828:74;38825:1;38822:81;38819:107;;;38906:18;;:::i;:::-;38819:107;38950:1;38947;38943:9;38936:16;;38653:305;;;;:::o;38964:185::-;39004:1;39021:20;39039:1;39021:20;:::i;:::-;39016:25;;39055:20;39073:1;39055:20;:::i;:::-;39050:25;;39094:1;39084:35;;39099:18;;:::i;:::-;39084:35;39141:1;39138;39134:9;39129:14;;38964:185;;;;:::o;39155:348::-;39195:7;39218:20;39236:1;39218:20;:::i;:::-;39213:25;;39252:20;39270:1;39252:20;:::i;:::-;39247:25;;39440:1;39372:66;39368:74;39365:1;39362:81;39357:1;39350:9;39343:17;39339:105;39336:131;;;39447:18;;:::i;:::-;39336:131;39495:1;39492;39488:9;39477:20;;39155:348;;;;:::o;39509:191::-;39549:4;39569:20;39587:1;39569:20;:::i;:::-;39564:25;;39603:20;39621:1;39603:20;:::i;:::-;39598:25;;39642:1;39639;39636:8;39633:34;;;39647:18;;:::i;:::-;39633:34;39692:1;39689;39685:9;39677:17;;39509:191;;;;:::o;39706:96::-;39743:7;39772:24;39790:5;39772:24;:::i;:::-;39761:35;;39706:96;;;:::o;39808:90::-;39842:7;39885:5;39878:13;39871:21;39860:32;;39808:90;;;:::o;39904:77::-;39941:7;39970:5;39959:16;;39904:77;;;:::o;39987:149::-;40023:7;40063:66;40056:5;40052:78;40041:89;;39987:149;;;:::o;40142:126::-;40179:7;40219:42;40212:5;40208:54;40197:65;;40142:126;;;:::o;40274:77::-;40311:7;40340:5;40329:16;;40274:77;;;:::o;40357:154::-;40441:6;40436:3;40431;40418:30;40503:1;40494:6;40489:3;40485:16;40478:27;40357:154;;;:::o;40517:307::-;40585:1;40595:113;40609:6;40606:1;40603:13;40595:113;;;40694:1;40689:3;40685:11;40679:18;40675:1;40670:3;40666:11;40659:39;40631:2;40628:1;40624:10;40619:15;;40595:113;;;40726:6;40723:1;40720:13;40717:101;;;40806:1;40797:6;40792:3;40788:16;40781:27;40717:101;40566:258;40517:307;;;:::o;40830:171::-;40869:3;40892:24;40910:5;40892:24;:::i;:::-;40883:33;;40938:4;40931:5;40928:15;40925:41;;;40946:18;;:::i;:::-;40925:41;40993:1;40986:5;40982:13;40975:20;;40830:171;;;:::o;41007:320::-;41051:6;41088:1;41082:4;41078:12;41068:22;;41135:1;41129:4;41125:12;41156:18;41146:81;;41212:4;41204:6;41200:17;41190:27;;41146:81;41274:2;41266:6;41263:14;41243:18;41240:38;41237:84;;;41293:18;;:::i;:::-;41237:84;41058:269;41007:320;;;:::o;41333:281::-;41416:27;41438:4;41416:27;:::i;:::-;41408:6;41404:40;41546:6;41534:10;41531:22;41510:18;41498:10;41495:34;41492:62;41489:88;;;41557:18;;:::i;:::-;41489:88;41597:10;41593:2;41586:22;41376:238;41333:281;;:::o;41620:233::-;41659:3;41682:24;41700:5;41682:24;:::i;:::-;41673:33;;41728:66;41721:5;41718:77;41715:103;;;41798:18;;:::i;:::-;41715:103;41845:1;41838:5;41834:13;41827:20;;41620:233;;;:::o;41859:176::-;41891:1;41908:20;41926:1;41908:20;:::i;:::-;41903:25;;41942:20;41960:1;41942:20;:::i;:::-;41937:25;;41981:1;41971:35;;41986:18;;:::i;:::-;41971:35;42027:1;42024;42020:9;42015:14;;41859:176;;;;:::o;42041:180::-;42089:77;42086:1;42079:88;42186:4;42183:1;42176:15;42210:4;42207:1;42200:15;42227:180;42275:77;42272:1;42265:88;42372:4;42369:1;42362:15;42396:4;42393:1;42386:15;42413:180;42461:77;42458:1;42451:88;42558:4;42555:1;42548:15;42582:4;42579:1;42572:15;42599:180;42647:77;42644:1;42637:88;42744:4;42741:1;42734:15;42768:4;42765:1;42758:15;42785:180;42833:77;42830:1;42823:88;42930:4;42927:1;42920:15;42954:4;42951:1;42944:15;42971:180;43019:77;43016:1;43009:88;43116:4;43113:1;43106:15;43140:4;43137:1;43130:15;43157:117;43266:1;43263;43256:12;43280:117;43389:1;43386;43379:12;43403:117;43512:1;43509;43502:12;43526:117;43635:1;43632;43625:12;43649:117;43758:1;43755;43748:12;43772:102;43813:6;43864:2;43860:7;43855:2;43848:5;43844:14;43840:28;43830:38;;43772:102;;;:::o;43880:182::-;44020:34;44016:1;44008:6;44004:14;43997:58;43880:182;:::o;44068:297::-;44208:34;44204:1;44196:6;44192:14;44185:58;44277:34;44272:2;44264:6;44260:15;44253:59;44346:11;44341:2;44333:6;44329:15;44322:36;44068:297;:::o;44371:234::-;44511:34;44507:1;44499:6;44495:14;44488:58;44580:17;44575:2;44567:6;44563:15;44556:42;44371:234;:::o;44611:230::-;44751:34;44747:1;44739:6;44735:14;44728:58;44820:13;44815:2;44807:6;44803:15;44796:38;44611:230;:::o;44847:237::-;44987:34;44983:1;44975:6;44971:14;44964:58;45056:20;45051:2;45043:6;45039:15;45032:45;44847:237;:::o;45090:228::-;45230:34;45226:1;45218:6;45214:14;45207:58;45299:11;45294:2;45286:6;45282:15;45275:36;45090:228;:::o;45324:178::-;45464:30;45460:1;45452:6;45448:14;45441:54;45324:178;:::o;45508:242::-;45648:34;45644:1;45636:6;45632:14;45625:58;45717:25;45712:2;45704:6;45700:15;45693:50;45508:242;:::o;45756:223::-;45896:34;45892:1;45884:6;45880:14;45873:58;45965:6;45960:2;45952:6;45948:15;45941:31;45756:223;:::o;45985:175::-;46125:27;46121:1;46113:6;46109:14;46102:51;45985:175;:::o;46166:231::-;46306:34;46302:1;46294:6;46290:14;46283:58;46375:14;46370:2;46362:6;46358:15;46351:39;46166:231;:::o;46403:226::-;46543:34;46539:1;46531:6;46527:14;46520:58;46612:9;46607:2;46599:6;46595:15;46588:34;46403:226;:::o;46635:243::-;46775:34;46771:1;46763:6;46759:14;46752:58;46844:26;46839:2;46831:6;46827:15;46820:51;46635:243;:::o;46884:229::-;47024:34;47020:1;47012:6;47008:14;47001:58;47093:12;47088:2;47080:6;47076:15;47069:37;46884:229;:::o;47119:228::-;47259:34;47255:1;47247:6;47243:14;47236:58;47328:11;47323:2;47315:6;47311:15;47304:36;47119:228;:::o;47353:225::-;47493:34;47489:1;47481:6;47477:14;47470:58;47562:8;47557:2;47549:6;47545:15;47538:33;47353:225;:::o;47584:182::-;47724:34;47720:1;47712:6;47708:14;47701:58;47584:182;:::o;47772:231::-;47912:34;47908:1;47900:6;47896:14;47889:58;47981:14;47976:2;47968:6;47964:15;47957:39;47772:231;:::o;48009:228::-;48149:34;48145:1;48137:6;48133:14;48126:58;48218:11;48213:2;48205:6;48201:15;48194:36;48009:228;:::o;48243:220::-;48383:34;48379:1;48371:6;48367:14;48360:58;48452:3;48447:2;48439:6;48435:15;48428:28;48243:220;:::o;48469:236::-;48609:34;48605:1;48597:6;48593:14;48586:58;48678:19;48673:2;48665:6;48661:15;48654:44;48469:236;:::o;48711:231::-;48851:34;48847:1;48839:6;48835:14;48828:58;48920:14;48915:2;48907:6;48903:15;48896:39;48711:231;:::o;48948:173::-;49088:25;49084:1;49076:6;49072:14;49065:49;48948:173;:::o;49127:226::-;49267:34;49263:1;49255:6;49251:14;49244:58;49336:9;49331:2;49323:6;49319:15;49312:34;49127:226;:::o;49359:244::-;49499:34;49495:1;49487:6;49483:14;49476:58;49568:27;49563:2;49555:6;49551:15;49544:52;49359:244;:::o;49609:167::-;49749:19;49745:1;49737:6;49733:14;49726:43;49609:167;:::o;49782:234::-;49922:34;49918:1;49910:6;49906:14;49899:58;49991:17;49986:2;49978:6;49974:15;49967:42;49782:234;:::o;50022:122::-;50095:24;50113:5;50095:24;:::i;:::-;50088:5;50085:35;50075:63;;50134:1;50131;50124:12;50075:63;50022:122;:::o;50150:116::-;50220:21;50235:5;50220:21;:::i;:::-;50213:5;50210:32;50200:60;;50256:1;50253;50246:12;50200:60;50150:116;:::o;50272:122::-;50345:24;50363:5;50345:24;:::i;:::-;50338:5;50335:35;50325:63;;50384:1;50381;50374:12;50325:63;50272:122;:::o;50400:120::-;50472:23;50489:5;50472:23;:::i;:::-;50465:5;50462:34;50452:62;;50510:1;50507;50500:12;50452:62;50400:120;:::o;50526:122::-;50599:24;50617:5;50599:24;:::i;:::-;50592:5;50589:35;50579:63;;50638:1;50635;50628:12;50579:63;50526:122;:::o
Metadata Hash
ipfs://e7d6eb79e8012a0f28288693929659a29caaf3c0f1495be1ea190d1964579177