Token Shogun War Land
Overview ERC-721
Total Supply:
6,644 ShogunWarLand
Holders:
3,118 addresses
Contract:
Balance
1 ShogunWarLand
[ Download CSV Export ]
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Land
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Arbiscan.io on 2022-04-16 */ // Sources flattened with hardhat v2.8.3 https://hardhat.org // 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/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // 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; } } // File contracts/TrainingGround.sol pragma solidity 0.8.7; contract TrainingGround is Ownable { // shogun training duration uint256 public constant trainingDuration = 30 days; // amount of shoguns training uint256 public shogunTraining; // shogun NFT Shogun public shogun; // training tracking mapping(uint256 => uint256) public timestampJoined; mapping(uint256 => uint256) public timestampFinished; // Shogun trained mapping(uint256 => bool) public shogunTrained; uint256[] public shogunsTrained; event JoinTraining(uint256 tokenId, uint256 timestampJoined, uint256 timestampFinished); event FinishTraining(uint256 tokenId); event ShogunSet(address shogun); modifier onlyShogunOwner(uint256 _tokenId) { require(shogun.ownerOf(_tokenId) == msg.sender, "Training: only owner can send to training"); _; } modifier onlyUntrainedShogun(uint256 _tokenId) { require(shogunTrained[_tokenId] == false, "Training: Shogun already trained"); _; } modifier atTraining(uint256 _tokenId, bool expectedAtTraining) { require(isAtTraining(_tokenId) == expectedAtTraining, "Training: wrong training attendance"); _; } modifier updateTotalTraining(bool isJoining) { isJoining ? shogunTraining++ : shogunTraining--; _; } modifier isTrainingFinished(uint256 _tokenId) { require(block.timestamp > timestampFinished[_tokenId], "Training: Your shogun is not ready to leave training yet"); _; } function totalTraining() public view returns (uint256) { return shogunTraining; } function trainingFinishedDate(uint256 _tokenId) public view returns (uint256) { return timestampFinished[_tokenId]; } function isTrained(uint256 _tokenId) public view returns (bool) { return shogunTrained[_tokenId]; } function isAtTraining(uint256 _tokenId) public view returns (bool) { return timestampJoined[_tokenId] > 0; } function getTrainedShoguns() public view returns (uint256[] memory) { return shogunsTrained; } function join(uint256 _tokenId) external onlyShogunOwner(_tokenId) atTraining(_tokenId, false) onlyUntrainedShogun(_tokenId) updateTotalTraining(true) { timestampJoined[_tokenId] = block.timestamp; timestampFinished[_tokenId] = block.timestamp + trainingDuration; shogun.freezeTransfer(_tokenId); emit JoinTraining(_tokenId, timestampJoined[_tokenId], timestampFinished[_tokenId]); } function drop(uint256 _tokenId) external onlyShogunOwner(_tokenId) atTraining(_tokenId, true) isTrainingFinished(_tokenId) updateTotalTraining(false) { shogun.unfreezeTransfer(_tokenId); shogunTrained[_tokenId] = true; timestampJoined[_tokenId] = 0; shogunsTrained.push(_tokenId); emit FinishTraining(_tokenId); } // ADMIN function setShogun(address _shogun) external onlyOwner { shogun = Shogun(_shogun); emit ShogunSet(_shogun); } function forceDrop(uint256 _tokenId) external onlyOwner updateTotalTraining(false) { shogun.unfreezeTransfer(_tokenId); shogunTrained[_tokenId] = true; timestampJoined[_tokenId] = 0; shogunsTrained.push(_tokenId); emit FinishTraining(_tokenId); } } // File contracts/Land.sol pragma solidity 0.8.7; contract Land is MinterControl, ERC721Enumerable { using Strings for uint256; using Counters for Counters.Counter; Counters.Counter private _tokenIdCounter; string public baseURI; uint256 public landMaxLevel; mapping(uint256 => bool) public landIssued; mapping(uint256 => uint256) public landLevels; mapping(uint256 => bool) internal landFrozen; TrainingGround public trainingGround; Shogun public shogun; event LandMint(address indexed to, uint256 tokenId); event TrainingGroundSet(address trainingGround); event ShogunSet(address shogun); event LandUpgrade(uint256 indexed tokenId, uint256 availableLevel); event LandMaxLevel(uint256 landMaxLevel); constructor() ERC721("Shogun War Land", "ShogunWarLand") { _tokenIdCounter._value = 1; } function supportsInterface(bytes4 interfaceId) public view override(ERC721Enumerable, AccessControl) returns (bool) { return ERC721Enumerable.supportsInterface(interfaceId) || AccessControl.supportsInterface(interfaceId); } function mint(uint256[] memory shogunIds) external { require(shogunIds.length > 0, "Must provide at least one Shogun Id"); require(shogun.balanceOf(msg.sender) > 0, "Wallet address does not hold a Shogun"); for(uint256 i = 0; i < shogunIds.length; i++) { require(shogun.ownerOf(shogunIds[i]) == msg.sender, "You do not own one of the shoguns"); require(trainingGround.isTrained(shogunIds[i]), "Shogun not trained, cannot claim land"); require(!landIssued[shogunIds[i]], "This shogun has already claimed their land"); landIssued[shogunIds[i]] = true; _mint(msg.sender); } } function safeMint(address to) public onlyOwner { _mint(to); } function _mint(address _to) internal { uint256 _tokenId; _tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); landLevels[_tokenId] = 1; _safeMint(_to, _tokenId); emit LandMint(_to, _tokenId); } function freezeTransfer(uint256 _tokenId) external onlyOwner { landFrozen[_tokenId] = true; } function unfreezeTransfer(uint256 _tokenId) external onlyOwner { landFrozen[_tokenId] = false; } function setLandLevel(uint256 _tokenId, uint256 level) external onlyOwner { landLevels[_tokenId] = level; } function landLevel(uint256 _tokenId) public view returns (uint256) { return landLevels[_tokenId]; } function isLandIssued(uint256 _tokenId) public view returns (bool) { return landIssued[_tokenId]; } function isLandFrozen(uint256 _tokenId) public view returns (bool) { return landFrozen[_tokenId]; } function _beforeTokenTransfer( address _from, address _to, uint256 _tokenId ) internal override { super._beforeTokenTransfer(_from, _to, _tokenId); require(landFrozen[_tokenId] == false, "Land is still in use"); } function tokenURI(uint256 _tokenId) public view override returns (string memory) { // set up api URL to return golden ticket metadata require(_exists(_tokenId), "URI query for nonexistent token"); return bytes(baseURI).length > 0 ? string(abi.encodePacked( baseURI, _tokenId.toString() )) : ""; } function _baseURI() internal view override returns (string memory) { return baseURI; } // ADMIN function setTrainingGround(address _trainingGround) external onlyOwner { trainingGround = TrainingGround(_trainingGround); emit TrainingGroundSet(_trainingGround); } function setShogun(address _shogun) external onlyOwner { shogun = Shogun(_shogun); emit ShogunSet(_shogun); } function setBaseURI(string memory _baseURItoSet) external onlyOwner { baseURI = _baseURItoSet; } function setMaxLevel(uint256 _landMaxLevel) external onlyOwner { landMaxLevel = _landMaxLevel; emit LandMaxLevel(_landMaxLevel); } }
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":false,"internalType":"uint256","name":"landMaxLevel","type":"uint256"}],"name":"LandMaxLevel","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"LandMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"availableLevel","type":"uint256"}],"name":"LandUpgrade","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":"shogun","type":"address"}],"name":"ShogunSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"trainingGround","type":"address"}],"name":"TrainingGroundSet","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":"uint256","name":"_tokenId","type":"uint256"}],"name":"isLandFrozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"isLandIssued","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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"landIssued","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"landLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"landLevels","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"landMaxLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"shogunIds","type":"uint256[]"}],"name":"mint","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":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"level","type":"uint256"}],"name":"setLandLevel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_landMaxLevel","type":"uint256"}],"name":"setMaxLevel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_shogun","type":"address"}],"name":"setShogun","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_trainingGround","type":"address"}],"name":"setTrainingGround","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shogun","outputs":[{"internalType":"contract Shogun","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"trainingGround","outputs":[{"internalType":"contract TrainingGround","name":"","type":"address"}],"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
60806040523480156200001157600080fd5b506040518060400160405280600f81526020017f53686f67756e20576172204c616e6400000000000000000000000000000000008152506040518060400160405280600d81526020017f53686f67756e5761724c616e6400000000000000000000000000000000000000815250620000b07ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b5806200018860201b60201c565b620001027f0cb8f078b79b327d22a270f4beeaec8b625c77a623beca042797690c1d54762d7ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b56200018860201b60201c565b620001437ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b562000137620001eb60201b60201c565b620001f360201b60201c565b81600190805190602001906200015b92919062000383565b5080600290805190602001906200017492919062000383565b5050506001600b6000018190555062000498565b60006200019b836200020960201b60201c565b905081600080858152602001908152602001600020600101819055508181847fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff60405160405180910390a4505050565b600033905090565b6200020582826200022860201b60201c565b5050565b6000806000838152602001908152602001600020600101549050919050565b6200023a82826200031960201b60201c565b6200031557600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620002ba620001eb60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b828054620003919062000433565b90600052602060002090601f016020900481019282620003b5576000855562000401565b82601f10620003d057805160ff191683800117855562000401565b8280016001018555821562000401579182015b8281111562000400578251825591602001919060010190620003e3565b5b50905062000410919062000414565b5090565b5b808211156200042f57600081600090555060010162000415565b5090565b600060028204905060018216806200044c57607f821691505b6020821081141562000463576200046262000469565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6155c680620004a86000396000f3fe608060405234801561001057600080fd5b50600436106102a05760003560e01c806355f804b311610167578063a5ea5e34116100ce578063dc97805911610087578063dc9780591461088d578063e985e9c5146108a9578063f298f9c5146108d9578063f4574d55146108f7578063f8e93ef914610913578063f91bfc7c1461092f576102a0565b8063a5ea5e34146107bb578063aa271e1a146107d9578063b4549a4b14610809578063b88d4fde14610825578063c87b56dd14610841578063d547741f14610871576102a0565b806389c732e71161012057806389c732e7146106e757806391d148541461070357806391fb1ffe1461073357806395d89b4114610763578063a217fddf14610781578063a22cb4651461079f576102a0565b806355f804b3146106135780636352211e1461062f57806365c9b9711461065f5780636c0360eb1461067d57806370a082311461069b578063864f25d2146106cb576102a0565b80632f2ff15d1161020b57806340d097c3116101c457806340d097c31461054157806342842e0e1461055d57806349ab216c146105795780634f6ccce71461059757806353771281146105c757806354c9fb07146105e3576102a0565b80632f2ff15d146104715780632f54bf6e1461048d5780632f745c59146104bd5780633092afd5146104ed578063344f1ba51461050957806336568abe14610525576102a0565b80631834c9571161025d5780631834c9571461038d5780632220b719146103bd57806323b872dd146103ed578063248a9ca31461040957806324e219e914610439578063261707fa14610455576102a0565b806301ffc9a7146102a557806306fdde03146102d5578063081812fc146102f3578063095ea7b31461032357806314fdbdd31461033f57806318160ddd1461036f575b600080fd5b6102bf60048036038101906102ba9190613d61565b61094d565b6040516102cc9190614490565b60405180910390f35b6102dd61096f565b6040516102ea91906144fc565b60405180910390f35b61030d60048036038101906103089190613e04565b610a01565b60405161031a9190614429565b60405180910390f35b61033d60048036038101906103389190613bf5565b610a86565b005b61035960048036038101906103549190613e04565b610b9e565b6040516103669190614490565b60405180910390f35b610377610bc8565b604051610384919061483e565b60405180910390f35b6103a760048036038101906103a29190613e04565b610bd5565b6040516103b49190614490565b60405180910390f35b6103d760048036038101906103d29190613e04565b610bff565b6040516103e49190614490565b60405180910390f35b61040760048036038101906104029190613adf565b610c1f565b005b610423600480360381019061041e9190613cf4565b610c7f565b60405161043091906144ab565b60405180910390f35b610453600480360381019061044e9190613e5e565b610c9e565b005b61046f600480360381019061046a9190613a45565b610d2a565b005b61048b60048036038101906104869190613d21565b610d57565b005b6104a760048036038101906104a29190613a45565b610d80565b6040516104b49190614490565b60405180910390f35b6104d760048036038101906104d29190613bf5565b610db3565b6040516104e4919061483e565b60405180910390f35b61050760048036038101906105029190613a45565b610e58565b005b610523600480360381019061051e9190613e04565b610e85565b005b61053f600480360381019061053a9190613d21565b610f36565b005b61055b60048036038101906105569190613a45565b610fb9565b005b61057760048036038101906105729190613adf565b611035565b005b610581611055565b60405161058e91906144ab565b60405180910390f35b6105b160048036038101906105ac9190613e04565b611079565b6040516105be919061483e565b60405180910390f35b6105e160048036038101906105dc9190613e04565b6110ea565b005b6105fd60048036038101906105f89190613e04565b611189565b60405161060a919061483e565b60405180910390f35b61062d60048036038101906106289190613dbb565b6111a6565b005b61064960048036038101906106449190613e04565b611230565b6040516106569190614429565b60405180910390f35b6106676112e2565b60405161067491906144c6565b60405180910390f35b610685611308565b60405161069291906144fc565b60405180910390f35b6106b560048036038101906106b09190613a45565b611396565b6040516106c2919061483e565b60405180910390f35b6106e560048036038101906106e09190613a45565b61144e565b005b61070160048036038101906106fc9190613e04565b611539565b005b61071d60048036038101906107189190613d21565b6115d8565b60405161072a9190614490565b60405180910390f35b61074d60048036038101906107489190613e04565b611642565b60405161075a919061483e565b60405180910390f35b61076b61165a565b60405161077891906144fc565b60405180910390f35b6107896116ec565b60405161079691906144ab565b60405180910390f35b6107b960048036038101906107b49190613bb5565b6116f3565b005b6107c3611709565b6040516107d091906144e1565b60405180910390f35b6107f360048036038101906107ee9190613a45565b61172f565b6040516108009190614490565b60405180910390f35b610823600480360381019061081e9190613c35565b611762565b005b61083f600480360381019061083a9190613b32565b6117c9565b005b61085b60048036038101906108569190613e04565b61182b565b60405161086891906144fc565b60405180910390f35b61088b60048036038101906108869190613d21565b6118d3565b005b6108a760048036038101906108a29190613a45565b6118fc565b005b6108c360048036038101906108be9190613a9f565b611929565b6040516108d09190614490565b60405180910390f35b6108e16119bd565b6040516108ee919061483e565b60405180910390f35b610911600480360381019061090c9190613a45565b6119c3565b005b61092d60048036038101906109289190613c7e565b611aae565b005b610937611f02565b60405161094491906144ab565b60405180910390f35b600061095882611f26565b80610968575061096782611fa0565b5b9050919050565b60606001805461097e90614bd7565b80601f01602080910402602001604051908101604052809291908181526020018280546109aa90614bd7565b80156109f75780601f106109cc576101008083540402835291602001916109f7565b820191906000526020600020905b8154815290600101906020018083116109da57829003601f168201915b5050505050905090565b6000610a0c8261201a565b610a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a42906146fe565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a9182611230565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af99061475e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b21612086565b73ffffffffffffffffffffffffffffffffffffffff161480610b505750610b4f81610b4a612086565b611929565b5b610b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b869061463e565b60405180910390fd5b610b99838361208e565b505050565b60006010600083815260200190815260200160002060009054906101000a900460ff169050919050565b6000600980549050905090565b6000600e600083815260200190815260200160002060009054906101000a900460ff169050919050565b600e6020528060005260406000206000915054906101000a900460ff1681565b610c30610c2a612086565b82612147565b610c6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c669061477e565b60405180910390fd5b610c7a838383612225565b505050565b6000806000838152602001908152602001600020600101549050919050565b610ccf7ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b5610cca612086565b6115d8565b610d0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d05906146be565b60405180910390fd5b80600f6000848152602001908152602001600020819055505050565b610d547f0cb8f078b79b327d22a270f4beeaec8b625c77a623beca042797690c1d54762d82610d57565b50565b610d6082610c7f565b610d7181610d6c612086565b612481565b610d7b838361251e565b505050565b6000610dac7ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b5836115d8565b9050919050565b6000610dbe83611396565b8210610dff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df69061455e565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610e827f0cb8f078b79b327d22a270f4beeaec8b625c77a623beca042797690c1d54762d826118d3565b50565b610eb67ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b5610eb1612086565b6115d8565b610ef5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eec906146be565b60405180910390fd5b80600d819055507f2f61ebe91f71a0e705900e252d50f1e06077072fb7f9f7d06a4d609059bb3f0d81604051610f2b919061483e565b60405180910390a150565b610f3e612086565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610fab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa2906147fe565b60405180910390fd5b610fb582826125fe565b5050565b610fea7ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b5610fe5612086565b6115d8565b611029576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611020906146be565b60405180910390fd5b611032816126df565b50565b611050838383604051806020016040528060008152506117c9565b505050565b7ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b581565b6000611083610bc8565b82106110c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bb906147be565b60405180910390fd5b600982815481106110d8576110d7614d70565b5b90600052602060002001549050919050565b61111b7ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b5611116612086565b6115d8565b61115a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611151906146be565b60405180910390fd5b60016010600083815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600f6000838152602001908152602001600020549050919050565b6111d77ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b56111d2612086565b6115d8565b611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d906146be565b60405180910390fd5b80600c908051906020019061122c9291906136c9565b5050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d09061467e565b60405180910390fd5b80915050919050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c805461131590614bd7565b80601f016020809104026020016040519081016040528092919081815260200182805461134190614bd7565b801561138e5780601f106113635761010080835404028352916020019161138e565b820191906000526020600020905b81548152906001019060200180831161137157829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611407576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fe9061465e565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61147f7ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b561147a612086565b6115d8565b6114be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b5906146be565b60405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fc101eb61060fe6df3b217f739d54cd3b376f5813f90d93ca6137399933e36e2c8160405161152e9190614429565b60405180910390a150565b61156a7ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b5611565612086565b6115d8565b6115a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a0906146be565b60405180910390fd5b60006010600083815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f6020528060005260406000206000915090505481565b60606002805461166990614bd7565b80601f016020809104026020016040519081016040528092919081815260200182805461169590614bd7565b80156116e25780601f106116b7576101008083540402835291602001916116e2565b820191906000526020600020905b8154815290600101906020018083116116c557829003601f168201915b5050505050905090565b6000801b81565b6117056116fe612086565b838361276c565b5050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061175b7f0cb8f078b79b327d22a270f4beeaec8b625c77a623beca042797690c1d54762d836115d8565b9050919050565b60005b81518110156117c5576117b27f0cb8f078b79b327d22a270f4beeaec8b625c77a623beca042797690c1d54762d8383815181106117a5576117a4614d70565b5b6020026020010151610d57565b80806117bd90614c3a565b915050611765565b5050565b6117da6117d4612086565b83612147565b611819576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118109061477e565b60405180910390fd5b611825848484846128d9565b50505050565b60606118368261201a565b611875576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186c9061453e565b60405180910390fd5b6000600c805461188490614bd7565b9050116118a057604051806020016040528060008152506118cc565b600c6118ab83612935565b6040516020016118bc9291906143cb565b6040516020818303038152906040525b9050919050565b6118dc82610c7f565b6118ed816118e8612086565b612481565b6118f783836125fe565b505050565b6119267ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b582610d57565b50565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d5481565b6119f47ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b56119ef612086565b6115d8565b611a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2a906146be565b60405180910390fd5b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f61858301dd8e88e8811c389383328458091d0efd810f664be4ec29b4b758a19781604051611aa39190614429565b60405180910390a150565b6000815111611af2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae99061459e565b60405180910390fd5b6000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611b4f9190614429565b60206040518083038186803b158015611b6757600080fd5b505afa158015611b7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9f9190613e31565b11611bdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd6906147de565b60405180910390fd5b60005b8151811015611efe573373ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e848481518110611c5357611c52614d70565b5b60200260200101516040518263ffffffff1660e01b8152600401611c77919061483e565b60206040518083038186803b158015611c8f57600080fd5b505afa158015611ca3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc79190613a72565b73ffffffffffffffffffffffffffffffffffffffff1614611d1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d149061481e565b60405180910390fd5b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fd1135bb838381518110611d6e57611d6d614d70565b5b60200260200101516040518263ffffffff1660e01b8152600401611d92919061483e565b60206040518083038186803b158015611daa57600080fd5b505afa158015611dbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611de29190613cc7565b611e21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e189061469e565b60405180910390fd5b600e6000838381518110611e3857611e37614d70565b5b6020026020010151815260200190815260200160002060009054906101000a900460ff1615611e9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e939061471e565b60405180910390fd5b6001600e6000848481518110611eb557611eb4614d70565b5b6020026020010151815260200190815260200160002060006101000a81548160ff021916908315150217905550611eeb336126df565b8080611ef690614c3a565b915050611be2565b5050565b7f0cb8f078b79b327d22a270f4beeaec8b625c77a623beca042797690c1d54762d81565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611f995750611f9882612a96565b5b9050919050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612013575061201282612b78565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661210183611230565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006121528261201a565b612191576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121889061461e565b60405180910390fd5b600061219c83611230565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061220b57508373ffffffffffffffffffffffffffffffffffffffff166121f384610a01565b73ffffffffffffffffffffffffffffffffffffffff16145b8061221c575061221b8185611929565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661224582611230565b73ffffffffffffffffffffffffffffffffffffffff161461229b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122929061473e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561230b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612302906145de565b60405180910390fd5b612316838383612be2565b61232160008261208e565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123719190614a71565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123c89190614990565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61248b82826115d8565b61251a576124b08173ffffffffffffffffffffffffffffffffffffffff166014612c59565b6124be8360001c6020612c59565b6040516020016124cf9291906143ef565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251191906144fc565b60405180910390fd5b5050565b61252882826115d8565b6125fa57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061259f612086565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b61260882826115d8565b156126db57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612680612086565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60006126eb600b612e95565b90506126f7600b612ea3565b6001600f60008381526020019081526020016000208190555061271a8282612eb9565b8173ffffffffffffffffffffffffffffffffffffffff167fa28fb460c72a683a467d473a49feb6520de6c7df6f397c7e986d39a44c06234682604051612760919061483e565b60405180910390a25050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156127db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d2906145fe565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516128cc9190614490565b60405180910390a3505050565b6128e4848484612225565b6128f084848484612ed7565b61292f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129269061457e565b60405180910390fd5b50505050565b6060600082141561297d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a91565b600082905060005b600082146129af57808061299890614c3a565b915050600a826129a891906149e6565b9150612985565b60008167ffffffffffffffff8111156129cb576129ca614d9f565b5b6040519080825280601f01601f1916602001820160405280156129fd5781602001600182028036833780820191505090505b5090505b60008514612a8a57600182612a169190614a71565b9150600a85612a259190614c83565b6030612a319190614990565b60f81b818381518110612a4757612a46614d70565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a8391906149e6565b9450612a01565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612b6157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612b715750612b7082611fa0565b5b9050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612bed83838361306e565b600015156010600083815260200190815260200160002060009054906101000a900460ff16151514612c54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4b9061479e565b60405180910390fd5b505050565b606060006002836002612c6c9190614a17565b612c769190614990565b67ffffffffffffffff811115612c8f57612c8e614d9f565b5b6040519080825280601f01601f191660200182016040528015612cc15781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612cf957612cf8614d70565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612d5d57612d5c614d70565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612d9d9190614a17565b612da79190614990565b90505b6001811115612e47577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612de957612de8614d70565b5b1a60f81b828281518110612e0057612dff614d70565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612e4090614bad565b9050612daa565b5060008414612e8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e829061451e565b60405180910390fd5b8091505092915050565b600081600001549050919050565b6001816000016000828254019250508190555050565b612ed3828260405180602001604052806000815250613182565b5050565b6000612ef88473ffffffffffffffffffffffffffffffffffffffff166131dd565b15613061578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f21612086565b8786866040518563ffffffff1660e01b8152600401612f439493929190614444565b602060405180830381600087803b158015612f5d57600080fd5b505af1925050508015612f8e57506040513d601f19601f82011682018060405250810190612f8b9190613d8e565b60015b613011573d8060008114612fbe576040519150601f19603f3d011682016040523d82523d6000602084013e612fc3565b606091505b50600081511415613009576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130009061457e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613066565b600190505b949350505050565b6130798383836131f0565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156130bc576130b7816131f5565b6130fb565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146130fa576130f9838261323e565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561313e57613139816133ab565b61317d565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461317c5761317b828261347c565b5b5b505050565b61318c83836134fb565b6131996000848484612ed7565b6131d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131cf9061457e565b60405180910390fd5b505050565b600080823b905060008111915050919050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161324b84611396565b6132559190614a71565b905060006008600084815260200190815260200160002054905081811461333a576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016009805490506133bf9190614a71565b90506000600a60008481526020019081526020016000205490506000600983815481106133ef576133ee614d70565b5b90600052602060002001549050806009838154811061341157613410614d70565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a60008581526020019081526020016000206000905560098054806134605761345f614d41565b5b6001900381819060005260206000200160009055905550505050565b600061348783611396565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561356b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613562906146de565b60405180910390fd5b6135748161201a565b156135b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135ab906145be565b60405180910390fd5b6135c060008383612be2565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546136109190614990565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546136d590614bd7565b90600052602060002090601f0160209004810192826136f7576000855561373e565b82601f1061371057805160ff191683800117855561373e565b8280016001018555821561373e579182015b8281111561373d578251825591602001919060010190613722565b5b50905061374b919061374f565b5090565b5b80821115613768576000816000905550600101613750565b5090565b600061377f61377a8461487e565b614859565b905080838252602082019050828560208602820111156137a2576137a1614dd3565b5b60005b858110156137d257816137b888826138d0565b8452602084019350602083019250506001810190506137a5565b5050509392505050565b60006137ef6137ea846148aa565b614859565b9050808382526020820190508285602086028201111561381257613811614dd3565b5b60005b8581101561384257816138288882613a1b565b845260208401935060208301925050600181019050613815565b5050509392505050565b600061385f61385a846148d6565b614859565b90508281526020810184848401111561387b5761387a614dd8565b5b613886848285614b6b565b509392505050565b60006138a161389c84614907565b614859565b9050828152602081018484840111156138bd576138bc614dd8565b5b6138c8848285614b6b565b509392505050565b6000813590506138df8161551d565b92915050565b6000815190506138f48161551d565b92915050565b600082601f83011261390f5761390e614dce565b5b813561391f84826020860161376c565b91505092915050565b600082601f83011261393d5761393c614dce565b5b813561394d8482602086016137dc565b91505092915050565b60008135905061396581615534565b92915050565b60008151905061397a81615534565b92915050565b60008135905061398f8161554b565b92915050565b6000813590506139a481615562565b92915050565b6000815190506139b981615562565b92915050565b600082601f8301126139d4576139d3614dce565b5b81356139e484826020860161384c565b91505092915050565b600082601f830112613a0257613a01614dce565b5b8135613a1284826020860161388e565b91505092915050565b600081359050613a2a81615579565b92915050565b600081519050613a3f81615579565b92915050565b600060208284031215613a5b57613a5a614de2565b5b6000613a69848285016138d0565b91505092915050565b600060208284031215613a8857613a87614de2565b5b6000613a96848285016138e5565b91505092915050565b60008060408385031215613ab657613ab5614de2565b5b6000613ac4858286016138d0565b9250506020613ad5858286016138d0565b9150509250929050565b600080600060608486031215613af857613af7614de2565b5b6000613b06868287016138d0565b9350506020613b17868287016138d0565b9250506040613b2886828701613a1b565b9150509250925092565b60008060008060808587031215613b4c57613b4b614de2565b5b6000613b5a878288016138d0565b9450506020613b6b878288016138d0565b9350506040613b7c87828801613a1b565b925050606085013567ffffffffffffffff811115613b9d57613b9c614ddd565b5b613ba9878288016139bf565b91505092959194509250565b60008060408385031215613bcc57613bcb614de2565b5b6000613bda858286016138d0565b9250506020613beb85828601613956565b9150509250929050565b60008060408385031215613c0c57613c0b614de2565b5b6000613c1a858286016138d0565b9250506020613c2b85828601613a1b565b9150509250929050565b600060208284031215613c4b57613c4a614de2565b5b600082013567ffffffffffffffff811115613c6957613c68614ddd565b5b613c75848285016138fa565b91505092915050565b600060208284031215613c9457613c93614de2565b5b600082013567ffffffffffffffff811115613cb257613cb1614ddd565b5b613cbe84828501613928565b91505092915050565b600060208284031215613cdd57613cdc614de2565b5b6000613ceb8482850161396b565b91505092915050565b600060208284031215613d0a57613d09614de2565b5b6000613d1884828501613980565b91505092915050565b60008060408385031215613d3857613d37614de2565b5b6000613d4685828601613980565b9250506020613d57858286016138d0565b9150509250929050565b600060208284031215613d7757613d76614de2565b5b6000613d8584828501613995565b91505092915050565b600060208284031215613da457613da3614de2565b5b6000613db2848285016139aa565b91505092915050565b600060208284031215613dd157613dd0614de2565b5b600082013567ffffffffffffffff811115613def57613dee614ddd565b5b613dfb848285016139ed565b91505092915050565b600060208284031215613e1a57613e19614de2565b5b6000613e2884828501613a1b565b91505092915050565b600060208284031215613e4757613e46614de2565b5b6000613e5584828501613a30565b91505092915050565b60008060408385031215613e7557613e74614de2565b5b6000613e8385828601613a1b565b9250506020613e9485828601613a1b565b9150509250929050565b613ea781614aa5565b82525050565b613eb681614ab7565b82525050565b613ec581614ac3565b82525050565b6000613ed68261494d565b613ee08185614963565b9350613ef0818560208601614b7a565b613ef981614de7565b840191505092915050565b613f0d81614b23565b82525050565b613f1c81614b35565b82525050565b6000613f2d82614958565b613f378185614974565b9350613f47818560208601614b7a565b613f5081614de7565b840191505092915050565b6000613f6682614958565b613f708185614985565b9350613f80818560208601614b7a565b80840191505092915050565b60008154613f9981614bd7565b613fa38186614985565b94506001821660008114613fbe5760018114613fcf57614002565b60ff19831686528186019350614002565b613fd885614938565b60005b83811015613ffa57815481890152600182019150602081019050613fdb565b838801955050505b50505092915050565b6000614018602083614974565b915061402382614df8565b602082019050919050565b600061403b601f83614974565b915061404682614e21565b602082019050919050565b600061405e602b83614974565b915061406982614e4a565b604082019050919050565b6000614081603283614974565b915061408c82614e99565b604082019050919050565b60006140a4602383614974565b91506140af82614ee8565b604082019050919050565b60006140c7601c83614974565b91506140d282614f37565b602082019050919050565b60006140ea602483614974565b91506140f582614f60565b604082019050919050565b600061410d601983614974565b915061411882614faf565b602082019050919050565b6000614130602c83614974565b915061413b82614fd8565b604082019050919050565b6000614153603883614974565b915061415e82615027565b604082019050919050565b6000614176602a83614974565b915061418182615076565b604082019050919050565b6000614199602983614974565b91506141a4826150c5565b604082019050919050565b60006141bc602583614974565b91506141c782615114565b604082019050919050565b60006141df602683614974565b91506141ea82615163565b604082019050919050565b6000614202602083614974565b915061420d826151b2565b602082019050919050565b6000614225602c83614974565b9150614230826151db565b604082019050919050565b6000614248602a83614974565b91506142538261522a565b604082019050919050565b600061426b602983614974565b915061427682615279565b604082019050919050565b600061428e602183614974565b9150614299826152c8565b604082019050919050565b60006142b1603183614974565b91506142bc82615317565b604082019050919050565b60006142d4601483614974565b91506142df82615366565b602082019050919050565b60006142f7602c83614974565b91506143028261538f565b604082019050919050565b600061431a601783614985565b9150614325826153de565b601782019050919050565b600061433d602583614974565b915061434882615407565b604082019050919050565b6000614360601183614985565b915061436b82615456565b601182019050919050565b6000614383602f83614974565b915061438e8261547f565b604082019050919050565b60006143a6602183614974565b91506143b1826154ce565b604082019050919050565b6143c581614b19565b82525050565b60006143d78285613f8c565b91506143e38284613f5b565b91508190509392505050565b60006143fa8261430d565b91506144068285613f5b565b915061441182614353565b915061441d8284613f5b565b91508190509392505050565b600060208201905061443e6000830184613e9e565b92915050565b60006080820190506144596000830187613e9e565b6144666020830186613e9e565b61447360408301856143bc565b81810360608301526144858184613ecb565b905095945050505050565b60006020820190506144a56000830184613ead565b92915050565b60006020820190506144c06000830184613ebc565b92915050565b60006020820190506144db6000830184613f04565b92915050565b60006020820190506144f66000830184613f13565b92915050565b600060208201905081810360008301526145168184613f22565b905092915050565b600060208201905081810360008301526145378161400b565b9050919050565b600060208201905081810360008301526145578161402e565b9050919050565b6000602082019050818103600083015261457781614051565b9050919050565b6000602082019050818103600083015261459781614074565b9050919050565b600060208201905081810360008301526145b781614097565b9050919050565b600060208201905081810360008301526145d7816140ba565b9050919050565b600060208201905081810360008301526145f7816140dd565b9050919050565b6000602082019050818103600083015261461781614100565b9050919050565b6000602082019050818103600083015261463781614123565b9050919050565b6000602082019050818103600083015261465781614146565b9050919050565b6000602082019050818103600083015261467781614169565b9050919050565b600060208201905081810360008301526146978161418c565b9050919050565b600060208201905081810360008301526146b7816141af565b9050919050565b600060208201905081810360008301526146d7816141d2565b9050919050565b600060208201905081810360008301526146f7816141f5565b9050919050565b6000602082019050818103600083015261471781614218565b9050919050565b600060208201905081810360008301526147378161423b565b9050919050565b600060208201905081810360008301526147578161425e565b9050919050565b6000602082019050818103600083015261477781614281565b9050919050565b60006020820190508181036000830152614797816142a4565b9050919050565b600060208201905081810360008301526147b7816142c7565b9050919050565b600060208201905081810360008301526147d7816142ea565b9050919050565b600060208201905081810360008301526147f781614330565b9050919050565b6000602082019050818103600083015261481781614376565b9050919050565b6000602082019050818103600083015261483781614399565b9050919050565b600060208201905061485360008301846143bc565b92915050565b6000614863614874565b905061486f8282614c09565b919050565b6000604051905090565b600067ffffffffffffffff82111561489957614898614d9f565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156148c5576148c4614d9f565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156148f1576148f0614d9f565b5b6148fa82614de7565b9050602081019050919050565b600067ffffffffffffffff82111561492257614921614d9f565b5b61492b82614de7565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061499b82614b19565b91506149a683614b19565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156149db576149da614cb4565b5b828201905092915050565b60006149f182614b19565b91506149fc83614b19565b925082614a0c57614a0b614ce3565b5b828204905092915050565b6000614a2282614b19565b9150614a2d83614b19565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a6657614a65614cb4565b5b828202905092915050565b6000614a7c82614b19565b9150614a8783614b19565b925082821015614a9a57614a99614cb4565b5b828203905092915050565b6000614ab082614af9565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614b2e82614b47565b9050919050565b6000614b4082614b47565b9050919050565b6000614b5282614b59565b9050919050565b6000614b6482614af9565b9050919050565b82818337600083830152505050565b60005b83811015614b98578082015181840152602081019050614b7d565b83811115614ba7576000848401525b50505050565b6000614bb882614b19565b91506000821415614bcc57614bcb614cb4565b5b600182039050919050565b60006002820490506001821680614bef57607f821691505b60208210811415614c0357614c02614d12565b5b50919050565b614c1282614de7565b810181811067ffffffffffffffff82111715614c3157614c30614d9f565b5b80604052505050565b6000614c4582614b19565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c7857614c77614cb4565b5b600182019050919050565b6000614c8e82614b19565b9150614c9983614b19565b925082614ca957614ca8614ce3565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4d7573742070726f76696465206174206c65617374206f6e652053686f67756e60008201527f2049640000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f53686f67756e206e6f7420747261696e65642c2063616e6e6f7420636c61696d60008201527f206c616e64000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e746572436f6e74726f6c3a206e6f7420612053484f47554e5f4f574e4560008201527f525f524f4c450000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f546869732073686f67756e2068617320616c726561647920636c61696d65642060008201527f7468656972206c616e6400000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4c616e64206973207374696c6c20696e20757365000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f57616c6c6574206164647265737320646f6573206e6f7420686f6c642061205360008201527f686f67756e000000000000000000000000000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b7f596f7520646f206e6f74206f776e206f6e65206f66207468652073686f67756e60008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b61552681614aa5565b811461553157600080fd5b50565b61553d81614ab7565b811461554857600080fd5b50565b61555481614ac3565b811461555f57600080fd5b50565b61556b81614acd565b811461557657600080fd5b50565b61558281614b19565b811461558d57600080fd5b5056fea2646970667358221220e14b45bf92b6520d2ff5ee45f848073bcc2270ee7762d32359fc181123bd67e164736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102a05760003560e01c806355f804b311610167578063a5ea5e34116100ce578063dc97805911610087578063dc9780591461088d578063e985e9c5146108a9578063f298f9c5146108d9578063f4574d55146108f7578063f8e93ef914610913578063f91bfc7c1461092f576102a0565b8063a5ea5e34146107bb578063aa271e1a146107d9578063b4549a4b14610809578063b88d4fde14610825578063c87b56dd14610841578063d547741f14610871576102a0565b806389c732e71161012057806389c732e7146106e757806391d148541461070357806391fb1ffe1461073357806395d89b4114610763578063a217fddf14610781578063a22cb4651461079f576102a0565b806355f804b3146106135780636352211e1461062f57806365c9b9711461065f5780636c0360eb1461067d57806370a082311461069b578063864f25d2146106cb576102a0565b80632f2ff15d1161020b57806340d097c3116101c457806340d097c31461054157806342842e0e1461055d57806349ab216c146105795780634f6ccce71461059757806353771281146105c757806354c9fb07146105e3576102a0565b80632f2ff15d146104715780632f54bf6e1461048d5780632f745c59146104bd5780633092afd5146104ed578063344f1ba51461050957806336568abe14610525576102a0565b80631834c9571161025d5780631834c9571461038d5780632220b719146103bd57806323b872dd146103ed578063248a9ca31461040957806324e219e914610439578063261707fa14610455576102a0565b806301ffc9a7146102a557806306fdde03146102d5578063081812fc146102f3578063095ea7b31461032357806314fdbdd31461033f57806318160ddd1461036f575b600080fd5b6102bf60048036038101906102ba9190613d61565b61094d565b6040516102cc9190614490565b60405180910390f35b6102dd61096f565b6040516102ea91906144fc565b60405180910390f35b61030d60048036038101906103089190613e04565b610a01565b60405161031a9190614429565b60405180910390f35b61033d60048036038101906103389190613bf5565b610a86565b005b61035960048036038101906103549190613e04565b610b9e565b6040516103669190614490565b60405180910390f35b610377610bc8565b604051610384919061483e565b60405180910390f35b6103a760048036038101906103a29190613e04565b610bd5565b6040516103b49190614490565b60405180910390f35b6103d760048036038101906103d29190613e04565b610bff565b6040516103e49190614490565b60405180910390f35b61040760048036038101906104029190613adf565b610c1f565b005b610423600480360381019061041e9190613cf4565b610c7f565b60405161043091906144ab565b60405180910390f35b610453600480360381019061044e9190613e5e565b610c9e565b005b61046f600480360381019061046a9190613a45565b610d2a565b005b61048b60048036038101906104869190613d21565b610d57565b005b6104a760048036038101906104a29190613a45565b610d80565b6040516104b49190614490565b60405180910390f35b6104d760048036038101906104d29190613bf5565b610db3565b6040516104e4919061483e565b60405180910390f35b61050760048036038101906105029190613a45565b610e58565b005b610523600480360381019061051e9190613e04565b610e85565b005b61053f600480360381019061053a9190613d21565b610f36565b005b61055b60048036038101906105569190613a45565b610fb9565b005b61057760048036038101906105729190613adf565b611035565b005b610581611055565b60405161058e91906144ab565b60405180910390f35b6105b160048036038101906105ac9190613e04565b611079565b6040516105be919061483e565b60405180910390f35b6105e160048036038101906105dc9190613e04565b6110ea565b005b6105fd60048036038101906105f89190613e04565b611189565b60405161060a919061483e565b60405180910390f35b61062d60048036038101906106289190613dbb565b6111a6565b005b61064960048036038101906106449190613e04565b611230565b6040516106569190614429565b60405180910390f35b6106676112e2565b60405161067491906144c6565b60405180910390f35b610685611308565b60405161069291906144fc565b60405180910390f35b6106b560048036038101906106b09190613a45565b611396565b6040516106c2919061483e565b60405180910390f35b6106e560048036038101906106e09190613a45565b61144e565b005b61070160048036038101906106fc9190613e04565b611539565b005b61071d60048036038101906107189190613d21565b6115d8565b60405161072a9190614490565b60405180910390f35b61074d60048036038101906107489190613e04565b611642565b60405161075a919061483e565b60405180910390f35b61076b61165a565b60405161077891906144fc565b60405180910390f35b6107896116ec565b60405161079691906144ab565b60405180910390f35b6107b960048036038101906107b49190613bb5565b6116f3565b005b6107c3611709565b6040516107d091906144e1565b60405180910390f35b6107f360048036038101906107ee9190613a45565b61172f565b6040516108009190614490565b60405180910390f35b610823600480360381019061081e9190613c35565b611762565b005b61083f600480360381019061083a9190613b32565b6117c9565b005b61085b60048036038101906108569190613e04565b61182b565b60405161086891906144fc565b60405180910390f35b61088b60048036038101906108869190613d21565b6118d3565b005b6108a760048036038101906108a29190613a45565b6118fc565b005b6108c360048036038101906108be9190613a9f565b611929565b6040516108d09190614490565b60405180910390f35b6108e16119bd565b6040516108ee919061483e565b60405180910390f35b610911600480360381019061090c9190613a45565b6119c3565b005b61092d60048036038101906109289190613c7e565b611aae565b005b610937611f02565b60405161094491906144ab565b60405180910390f35b600061095882611f26565b80610968575061096782611fa0565b5b9050919050565b60606001805461097e90614bd7565b80601f01602080910402602001604051908101604052809291908181526020018280546109aa90614bd7565b80156109f75780601f106109cc576101008083540402835291602001916109f7565b820191906000526020600020905b8154815290600101906020018083116109da57829003601f168201915b5050505050905090565b6000610a0c8261201a565b610a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a42906146fe565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a9182611230565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af99061475e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b21612086565b73ffffffffffffffffffffffffffffffffffffffff161480610b505750610b4f81610b4a612086565b611929565b5b610b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b869061463e565b60405180910390fd5b610b99838361208e565b505050565b60006010600083815260200190815260200160002060009054906101000a900460ff169050919050565b6000600980549050905090565b6000600e600083815260200190815260200160002060009054906101000a900460ff169050919050565b600e6020528060005260406000206000915054906101000a900460ff1681565b610c30610c2a612086565b82612147565b610c6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c669061477e565b60405180910390fd5b610c7a838383612225565b505050565b6000806000838152602001908152602001600020600101549050919050565b610ccf7ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b5610cca612086565b6115d8565b610d0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d05906146be565b60405180910390fd5b80600f6000848152602001908152602001600020819055505050565b610d547f0cb8f078b79b327d22a270f4beeaec8b625c77a623beca042797690c1d54762d82610d57565b50565b610d6082610c7f565b610d7181610d6c612086565b612481565b610d7b838361251e565b505050565b6000610dac7ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b5836115d8565b9050919050565b6000610dbe83611396565b8210610dff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df69061455e565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610e827f0cb8f078b79b327d22a270f4beeaec8b625c77a623beca042797690c1d54762d826118d3565b50565b610eb67ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b5610eb1612086565b6115d8565b610ef5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eec906146be565b60405180910390fd5b80600d819055507f2f61ebe91f71a0e705900e252d50f1e06077072fb7f9f7d06a4d609059bb3f0d81604051610f2b919061483e565b60405180910390a150565b610f3e612086565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610fab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa2906147fe565b60405180910390fd5b610fb582826125fe565b5050565b610fea7ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b5610fe5612086565b6115d8565b611029576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611020906146be565b60405180910390fd5b611032816126df565b50565b611050838383604051806020016040528060008152506117c9565b505050565b7ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b581565b6000611083610bc8565b82106110c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bb906147be565b60405180910390fd5b600982815481106110d8576110d7614d70565b5b90600052602060002001549050919050565b61111b7ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b5611116612086565b6115d8565b61115a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611151906146be565b60405180910390fd5b60016010600083815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600f6000838152602001908152602001600020549050919050565b6111d77ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b56111d2612086565b6115d8565b611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d906146be565b60405180910390fd5b80600c908051906020019061122c9291906136c9565b5050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d09061467e565b60405180910390fd5b80915050919050565b601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c805461131590614bd7565b80601f016020809104026020016040519081016040528092919081815260200182805461134190614bd7565b801561138e5780601f106113635761010080835404028352916020019161138e565b820191906000526020600020905b81548152906001019060200180831161137157829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611407576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fe9061465e565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61147f7ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b561147a612086565b6115d8565b6114be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b5906146be565b60405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fc101eb61060fe6df3b217f739d54cd3b376f5813f90d93ca6137399933e36e2c8160405161152e9190614429565b60405180910390a150565b61156a7ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b5611565612086565b6115d8565b6115a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a0906146be565b60405180910390fd5b60006010600083815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f6020528060005260406000206000915090505481565b60606002805461166990614bd7565b80601f016020809104026020016040519081016040528092919081815260200182805461169590614bd7565b80156116e25780601f106116b7576101008083540402835291602001916116e2565b820191906000526020600020905b8154815290600101906020018083116116c557829003601f168201915b5050505050905090565b6000801b81565b6117056116fe612086565b838361276c565b5050565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061175b7f0cb8f078b79b327d22a270f4beeaec8b625c77a623beca042797690c1d54762d836115d8565b9050919050565b60005b81518110156117c5576117b27f0cb8f078b79b327d22a270f4beeaec8b625c77a623beca042797690c1d54762d8383815181106117a5576117a4614d70565b5b6020026020010151610d57565b80806117bd90614c3a565b915050611765565b5050565b6117da6117d4612086565b83612147565b611819576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118109061477e565b60405180910390fd5b611825848484846128d9565b50505050565b60606118368261201a565b611875576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186c9061453e565b60405180910390fd5b6000600c805461188490614bd7565b9050116118a057604051806020016040528060008152506118cc565b600c6118ab83612935565b6040516020016118bc9291906143cb565b6040516020818303038152906040525b9050919050565b6118dc82610c7f565b6118ed816118e8612086565b612481565b6118f783836125fe565b505050565b6119267ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b582610d57565b50565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d5481565b6119f47ff786c657c1afc7b60c0316a9881b42c6c8b080b437e91b362ae43d19e14911b56119ef612086565b6115d8565b611a33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2a906146be565b60405180910390fd5b80601260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f61858301dd8e88e8811c389383328458091d0efd810f664be4ec29b4b758a19781604051611aa39190614429565b60405180910390a150565b6000815111611af2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae99061459e565b60405180910390fd5b6000601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611b4f9190614429565b60206040518083038186803b158015611b6757600080fd5b505afa158015611b7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9f9190613e31565b11611bdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd6906147de565b60405180910390fd5b60005b8151811015611efe573373ffffffffffffffffffffffffffffffffffffffff16601260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e848481518110611c5357611c52614d70565b5b60200260200101516040518263ffffffff1660e01b8152600401611c77919061483e565b60206040518083038186803b158015611c8f57600080fd5b505afa158015611ca3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc79190613a72565b73ffffffffffffffffffffffffffffffffffffffff1614611d1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d149061481e565b60405180910390fd5b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fd1135bb838381518110611d6e57611d6d614d70565b5b60200260200101516040518263ffffffff1660e01b8152600401611d92919061483e565b60206040518083038186803b158015611daa57600080fd5b505afa158015611dbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611de29190613cc7565b611e21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e189061469e565b60405180910390fd5b600e6000838381518110611e3857611e37614d70565b5b6020026020010151815260200190815260200160002060009054906101000a900460ff1615611e9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e939061471e565b60405180910390fd5b6001600e6000848481518110611eb557611eb4614d70565b5b6020026020010151815260200190815260200160002060006101000a81548160ff021916908315150217905550611eeb336126df565b8080611ef690614c3a565b915050611be2565b5050565b7f0cb8f078b79b327d22a270f4beeaec8b625c77a623beca042797690c1d54762d81565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611f995750611f9882612a96565b5b9050919050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612013575061201282612b78565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661210183611230565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006121528261201a565b612191576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121889061461e565b60405180910390fd5b600061219c83611230565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061220b57508373ffffffffffffffffffffffffffffffffffffffff166121f384610a01565b73ffffffffffffffffffffffffffffffffffffffff16145b8061221c575061221b8185611929565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661224582611230565b73ffffffffffffffffffffffffffffffffffffffff161461229b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122929061473e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561230b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612302906145de565b60405180910390fd5b612316838383612be2565b61232160008261208e565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123719190614a71565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123c89190614990565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61248b82826115d8565b61251a576124b08173ffffffffffffffffffffffffffffffffffffffff166014612c59565b6124be8360001c6020612c59565b6040516020016124cf9291906143ef565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251191906144fc565b60405180910390fd5b5050565b61252882826115d8565b6125fa57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061259f612086565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b61260882826115d8565b156126db57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612680612086565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b60006126eb600b612e95565b90506126f7600b612ea3565b6001600f60008381526020019081526020016000208190555061271a8282612eb9565b8173ffffffffffffffffffffffffffffffffffffffff167fa28fb460c72a683a467d473a49feb6520de6c7df6f397c7e986d39a44c06234682604051612760919061483e565b60405180910390a25050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156127db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d2906145fe565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516128cc9190614490565b60405180910390a3505050565b6128e4848484612225565b6128f084848484612ed7565b61292f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129269061457e565b60405180910390fd5b50505050565b6060600082141561297d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a91565b600082905060005b600082146129af57808061299890614c3a565b915050600a826129a891906149e6565b9150612985565b60008167ffffffffffffffff8111156129cb576129ca614d9f565b5b6040519080825280601f01601f1916602001820160405280156129fd5781602001600182028036833780820191505090505b5090505b60008514612a8a57600182612a169190614a71565b9150600a85612a259190614c83565b6030612a319190614990565b60f81b818381518110612a4757612a46614d70565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a8391906149e6565b9450612a01565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612b6157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612b715750612b7082611fa0565b5b9050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612bed83838361306e565b600015156010600083815260200190815260200160002060009054906101000a900460ff16151514612c54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4b9061479e565b60405180910390fd5b505050565b606060006002836002612c6c9190614a17565b612c769190614990565b67ffffffffffffffff811115612c8f57612c8e614d9f565b5b6040519080825280601f01601f191660200182016040528015612cc15781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612cf957612cf8614d70565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612d5d57612d5c614d70565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612d9d9190614a17565b612da79190614990565b90505b6001811115612e47577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612de957612de8614d70565b5b1a60f81b828281518110612e0057612dff614d70565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612e4090614bad565b9050612daa565b5060008414612e8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e829061451e565b60405180910390fd5b8091505092915050565b600081600001549050919050565b6001816000016000828254019250508190555050565b612ed3828260405180602001604052806000815250613182565b5050565b6000612ef88473ffffffffffffffffffffffffffffffffffffffff166131dd565b15613061578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f21612086565b8786866040518563ffffffff1660e01b8152600401612f439493929190614444565b602060405180830381600087803b158015612f5d57600080fd5b505af1925050508015612f8e57506040513d601f19601f82011682018060405250810190612f8b9190613d8e565b60015b613011573d8060008114612fbe576040519150601f19603f3d011682016040523d82523d6000602084013e612fc3565b606091505b50600081511415613009576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130009061457e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613066565b600190505b949350505050565b6130798383836131f0565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156130bc576130b7816131f5565b6130fb565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146130fa576130f9838261323e565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561313e57613139816133ab565b61317d565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461317c5761317b828261347c565b5b5b505050565b61318c83836134fb565b6131996000848484612ed7565b6131d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131cf9061457e565b60405180910390fd5b505050565b600080823b905060008111915050919050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161324b84611396565b6132559190614a71565b905060006008600084815260200190815260200160002054905081811461333a576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016009805490506133bf9190614a71565b90506000600a60008481526020019081526020016000205490506000600983815481106133ef576133ee614d70565b5b90600052602060002001549050806009838154811061341157613410614d70565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a60008581526020019081526020016000206000905560098054806134605761345f614d41565b5b6001900381819060005260206000200160009055905550505050565b600061348783611396565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561356b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613562906146de565b60405180910390fd5b6135748161201a565b156135b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135ab906145be565b60405180910390fd5b6135c060008383612be2565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546136109190614990565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546136d590614bd7565b90600052602060002090601f0160209004810192826136f7576000855561373e565b82601f1061371057805160ff191683800117855561373e565b8280016001018555821561373e579182015b8281111561373d578251825591602001919060010190613722565b5b50905061374b919061374f565b5090565b5b80821115613768576000816000905550600101613750565b5090565b600061377f61377a8461487e565b614859565b905080838252602082019050828560208602820111156137a2576137a1614dd3565b5b60005b858110156137d257816137b888826138d0565b8452602084019350602083019250506001810190506137a5565b5050509392505050565b60006137ef6137ea846148aa565b614859565b9050808382526020820190508285602086028201111561381257613811614dd3565b5b60005b8581101561384257816138288882613a1b565b845260208401935060208301925050600181019050613815565b5050509392505050565b600061385f61385a846148d6565b614859565b90508281526020810184848401111561387b5761387a614dd8565b5b613886848285614b6b565b509392505050565b60006138a161389c84614907565b614859565b9050828152602081018484840111156138bd576138bc614dd8565b5b6138c8848285614b6b565b509392505050565b6000813590506138df8161551d565b92915050565b6000815190506138f48161551d565b92915050565b600082601f83011261390f5761390e614dce565b5b813561391f84826020860161376c565b91505092915050565b600082601f83011261393d5761393c614dce565b5b813561394d8482602086016137dc565b91505092915050565b60008135905061396581615534565b92915050565b60008151905061397a81615534565b92915050565b60008135905061398f8161554b565b92915050565b6000813590506139a481615562565b92915050565b6000815190506139b981615562565b92915050565b600082601f8301126139d4576139d3614dce565b5b81356139e484826020860161384c565b91505092915050565b600082601f830112613a0257613a01614dce565b5b8135613a1284826020860161388e565b91505092915050565b600081359050613a2a81615579565b92915050565b600081519050613a3f81615579565b92915050565b600060208284031215613a5b57613a5a614de2565b5b6000613a69848285016138d0565b91505092915050565b600060208284031215613a8857613a87614de2565b5b6000613a96848285016138e5565b91505092915050565b60008060408385031215613ab657613ab5614de2565b5b6000613ac4858286016138d0565b9250506020613ad5858286016138d0565b9150509250929050565b600080600060608486031215613af857613af7614de2565b5b6000613b06868287016138d0565b9350506020613b17868287016138d0565b9250506040613b2886828701613a1b565b9150509250925092565b60008060008060808587031215613b4c57613b4b614de2565b5b6000613b5a878288016138d0565b9450506020613b6b878288016138d0565b9350506040613b7c87828801613a1b565b925050606085013567ffffffffffffffff811115613b9d57613b9c614ddd565b5b613ba9878288016139bf565b91505092959194509250565b60008060408385031215613bcc57613bcb614de2565b5b6000613bda858286016138d0565b9250506020613beb85828601613956565b9150509250929050565b60008060408385031215613c0c57613c0b614de2565b5b6000613c1a858286016138d0565b9250506020613c2b85828601613a1b565b9150509250929050565b600060208284031215613c4b57613c4a614de2565b5b600082013567ffffffffffffffff811115613c6957613c68614ddd565b5b613c75848285016138fa565b91505092915050565b600060208284031215613c9457613c93614de2565b5b600082013567ffffffffffffffff811115613cb257613cb1614ddd565b5b613cbe84828501613928565b91505092915050565b600060208284031215613cdd57613cdc614de2565b5b6000613ceb8482850161396b565b91505092915050565b600060208284031215613d0a57613d09614de2565b5b6000613d1884828501613980565b91505092915050565b60008060408385031215613d3857613d37614de2565b5b6000613d4685828601613980565b9250506020613d57858286016138d0565b9150509250929050565b600060208284031215613d7757613d76614de2565b5b6000613d8584828501613995565b91505092915050565b600060208284031215613da457613da3614de2565b5b6000613db2848285016139aa565b91505092915050565b600060208284031215613dd157613dd0614de2565b5b600082013567ffffffffffffffff811115613def57613dee614ddd565b5b613dfb848285016139ed565b91505092915050565b600060208284031215613e1a57613e19614de2565b5b6000613e2884828501613a1b565b91505092915050565b600060208284031215613e4757613e46614de2565b5b6000613e5584828501613a30565b91505092915050565b60008060408385031215613e7557613e74614de2565b5b6000613e8385828601613a1b565b9250506020613e9485828601613a1b565b9150509250929050565b613ea781614aa5565b82525050565b613eb681614ab7565b82525050565b613ec581614ac3565b82525050565b6000613ed68261494d565b613ee08185614963565b9350613ef0818560208601614b7a565b613ef981614de7565b840191505092915050565b613f0d81614b23565b82525050565b613f1c81614b35565b82525050565b6000613f2d82614958565b613f378185614974565b9350613f47818560208601614b7a565b613f5081614de7565b840191505092915050565b6000613f6682614958565b613f708185614985565b9350613f80818560208601614b7a565b80840191505092915050565b60008154613f9981614bd7565b613fa38186614985565b94506001821660008114613fbe5760018114613fcf57614002565b60ff19831686528186019350614002565b613fd885614938565b60005b83811015613ffa57815481890152600182019150602081019050613fdb565b838801955050505b50505092915050565b6000614018602083614974565b915061402382614df8565b602082019050919050565b600061403b601f83614974565b915061404682614e21565b602082019050919050565b600061405e602b83614974565b915061406982614e4a565b604082019050919050565b6000614081603283614974565b915061408c82614e99565b604082019050919050565b60006140a4602383614974565b91506140af82614ee8565b604082019050919050565b60006140c7601c83614974565b91506140d282614f37565b602082019050919050565b60006140ea602483614974565b91506140f582614f60565b604082019050919050565b600061410d601983614974565b915061411882614faf565b602082019050919050565b6000614130602c83614974565b915061413b82614fd8565b604082019050919050565b6000614153603883614974565b915061415e82615027565b604082019050919050565b6000614176602a83614974565b915061418182615076565b604082019050919050565b6000614199602983614974565b91506141a4826150c5565b604082019050919050565b60006141bc602583614974565b91506141c782615114565b604082019050919050565b60006141df602683614974565b91506141ea82615163565b604082019050919050565b6000614202602083614974565b915061420d826151b2565b602082019050919050565b6000614225602c83614974565b9150614230826151db565b604082019050919050565b6000614248602a83614974565b91506142538261522a565b604082019050919050565b600061426b602983614974565b915061427682615279565b604082019050919050565b600061428e602183614974565b9150614299826152c8565b604082019050919050565b60006142b1603183614974565b91506142bc82615317565b604082019050919050565b60006142d4601483614974565b91506142df82615366565b602082019050919050565b60006142f7602c83614974565b91506143028261538f565b604082019050919050565b600061431a601783614985565b9150614325826153de565b601782019050919050565b600061433d602583614974565b915061434882615407565b604082019050919050565b6000614360601183614985565b915061436b82615456565b601182019050919050565b6000614383602f83614974565b915061438e8261547f565b604082019050919050565b60006143a6602183614974565b91506143b1826154ce565b604082019050919050565b6143c581614b19565b82525050565b60006143d78285613f8c565b91506143e38284613f5b565b91508190509392505050565b60006143fa8261430d565b91506144068285613f5b565b915061441182614353565b915061441d8284613f5b565b91508190509392505050565b600060208201905061443e6000830184613e9e565b92915050565b60006080820190506144596000830187613e9e565b6144666020830186613e9e565b61447360408301856143bc565b81810360608301526144858184613ecb565b905095945050505050565b60006020820190506144a56000830184613ead565b92915050565b60006020820190506144c06000830184613ebc565b92915050565b60006020820190506144db6000830184613f04565b92915050565b60006020820190506144f66000830184613f13565b92915050565b600060208201905081810360008301526145168184613f22565b905092915050565b600060208201905081810360008301526145378161400b565b9050919050565b600060208201905081810360008301526145578161402e565b9050919050565b6000602082019050818103600083015261457781614051565b9050919050565b6000602082019050818103600083015261459781614074565b9050919050565b600060208201905081810360008301526145b781614097565b9050919050565b600060208201905081810360008301526145d7816140ba565b9050919050565b600060208201905081810360008301526145f7816140dd565b9050919050565b6000602082019050818103600083015261461781614100565b9050919050565b6000602082019050818103600083015261463781614123565b9050919050565b6000602082019050818103600083015261465781614146565b9050919050565b6000602082019050818103600083015261467781614169565b9050919050565b600060208201905081810360008301526146978161418c565b9050919050565b600060208201905081810360008301526146b7816141af565b9050919050565b600060208201905081810360008301526146d7816141d2565b9050919050565b600060208201905081810360008301526146f7816141f5565b9050919050565b6000602082019050818103600083015261471781614218565b9050919050565b600060208201905081810360008301526147378161423b565b9050919050565b600060208201905081810360008301526147578161425e565b9050919050565b6000602082019050818103600083015261477781614281565b9050919050565b60006020820190508181036000830152614797816142a4565b9050919050565b600060208201905081810360008301526147b7816142c7565b9050919050565b600060208201905081810360008301526147d7816142ea565b9050919050565b600060208201905081810360008301526147f781614330565b9050919050565b6000602082019050818103600083015261481781614376565b9050919050565b6000602082019050818103600083015261483781614399565b9050919050565b600060208201905061485360008301846143bc565b92915050565b6000614863614874565b905061486f8282614c09565b919050565b6000604051905090565b600067ffffffffffffffff82111561489957614898614d9f565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156148c5576148c4614d9f565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156148f1576148f0614d9f565b5b6148fa82614de7565b9050602081019050919050565b600067ffffffffffffffff82111561492257614921614d9f565b5b61492b82614de7565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061499b82614b19565b91506149a683614b19565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156149db576149da614cb4565b5b828201905092915050565b60006149f182614b19565b91506149fc83614b19565b925082614a0c57614a0b614ce3565b5b828204905092915050565b6000614a2282614b19565b9150614a2d83614b19565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a6657614a65614cb4565b5b828202905092915050565b6000614a7c82614b19565b9150614a8783614b19565b925082821015614a9a57614a99614cb4565b5b828203905092915050565b6000614ab082614af9565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614b2e82614b47565b9050919050565b6000614b4082614b47565b9050919050565b6000614b5282614b59565b9050919050565b6000614b6482614af9565b9050919050565b82818337600083830152505050565b60005b83811015614b98578082015181840152602081019050614b7d565b83811115614ba7576000848401525b50505050565b6000614bb882614b19565b91506000821415614bcc57614bcb614cb4565b5b600182039050919050565b60006002820490506001821680614bef57607f821691505b60208210811415614c0357614c02614d12565b5b50919050565b614c1282614de7565b810181811067ffffffffffffffff82111715614c3157614c30614d9f565b5b80604052505050565b6000614c4582614b19565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c7857614c77614cb4565b5b600182019050919050565b6000614c8e82614b19565b9150614c9983614b19565b925082614ca957614ca8614ce3565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4d7573742070726f76696465206174206c65617374206f6e652053686f67756e60008201527f2049640000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f53686f67756e206e6f7420747261696e65642c2063616e6e6f7420636c61696d60008201527f206c616e64000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e746572436f6e74726f6c3a206e6f7420612053484f47554e5f4f574e4560008201527f525f524f4c450000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f546869732073686f67756e2068617320616c726561647920636c61696d65642060008201527f7468656972206c616e6400000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4c616e64206973207374696c6c20696e20757365000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f57616c6c6574206164647265737320646f6573206e6f7420686f6c642061205360008201527f686f67756e000000000000000000000000000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b7f596f7520646f206e6f74206f776e206f6e65206f66207468652073686f67756e60008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b61552681614aa5565b811461553157600080fd5b50565b61553d81614ab7565b811461554857600080fd5b50565b61555481614ac3565b811461555f57600080fd5b50565b61556b81614acd565b811461557657600080fd5b50565b61558281614b19565b811461558d57600080fd5b5056fea2646970667358221220e14b45bf92b6520d2ff5ee45f848073bcc2270ee7762d32359fc181123bd67e164736f6c63430008070033
Deployed ByteCode Sourcemap
66528:4266:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67383:237;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22298:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23857:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23380:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69263:113;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36525;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69142;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66771:42;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24607:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54364:123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68894:119;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58700:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54749:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59353:120;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36193:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59001:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70638:153;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55797:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68306:75;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25017:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58037:74;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36715:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68665:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69021:113;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70520:110;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21992:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66968:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66707:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21722:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70184:188;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68778:108;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53249:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66820:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22467:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52340:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24150:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66925:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59113:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58812:181;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25273:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69660:392;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55141:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59245:100;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24376:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66735:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70380:132;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67628:670;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58118:76;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67383:237;67493:4;67517:47;67552:11;67517:34;:47::i;:::-;:95;;;;67568:44;67600:11;67568:31;:44::i;:::-;67517:95;67510:102;;67383:237;;;:::o;22298:100::-;22352:13;22385:5;22378:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22298:100;:::o;23857:221::-;23933:7;23961:16;23969:7;23961;:16::i;:::-;23953:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24046:15;:24;24062:7;24046:24;;;;;;;;;;;;;;;;;;;;;24039:31;;23857:221;;;:::o;23380:411::-;23461:13;23477:23;23492:7;23477:14;:23::i;:::-;23461:39;;23525:5;23519:11;;:2;:11;;;;23511:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23619:5;23603:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23628:37;23645:5;23652:12;:10;:12::i;:::-;23628:16;:37::i;:::-;23603:62;23581:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23762:21;23771:2;23775:7;23762:8;:21::i;:::-;23450:341;23380:411;;:::o;69263:113::-;69324:4;69348:10;:20;69359:8;69348:20;;;;;;;;;;;;;;;;;;;;;69341:27;;69263:113;;;:::o;36525:::-;36586:7;36613:10;:17;;;;36606:24;;36525:113;:::o;69142:::-;69203:4;69227:10;:20;69238:8;69227:20;;;;;;;;;;;;;;;;;;;;;69220:27;;69142:113;;;:::o;66771:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;24607:339::-;24802:41;24821:12;:10;:12::i;:::-;24835:7;24802:18;:41::i;:::-;24794:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24910:28;24920:4;24926:2;24930:7;24910:9;:28::i;:::-;24607:339;;;:::o;54364:123::-;54430:7;54457:6;:12;54464:4;54457:12;;;;;;;;;;;:22;;;54450:29;;54364:123;;;:::o;68894:119::-;58243:40;58081:30;58270:12;:10;:12::i;:::-;58243:7;:40::i;:::-;58235:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;69000:5:::1;68977:10;:20;68988:8;68977:20;;;;;;;;;;;:28;;;;68894:119:::0;;:::o;58700:104::-;58758:38;58163:31;58788:7;58758:9;:38::i;:::-;58700:104;:::o;54749:147::-;54832:18;54845:4;54832:12;:18::i;:::-;52831:30;52842:4;52848:12;:10;:12::i;:::-;52831:10;:30::i;:::-;54863:25:::1;54874:4;54880:7;54863:10;:25::i;:::-;54749:147:::0;;;:::o;59353:120::-;59407:4;59431:34;58081:30;59458:6;59431:7;:34::i;:::-;59424:41;;59353:120;;;:::o;36193:256::-;36290:7;36326:23;36343:5;36326:16;:23::i;:::-;36318:5;:31;36310:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;36415:12;:19;36428:5;36415:19;;;;;;;;;;;;;;;:26;36435:5;36415:26;;;;;;;;;;;;36408:33;;36193:256;;;;:::o;59001:104::-;59058:39;58163:31;59089:7;59058:10;:39::i;:::-;59001:104;:::o;70638:153::-;58243:40;58081:30;58270:12;:10;:12::i;:::-;58243:7;:40::i;:::-;58235:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;70727:13:::1;70712:12;:28;;;;70756:27;70769:13;70756:27;;;;;;:::i;:::-;;;;;;;;70638:153:::0;:::o;55797:218::-;55904:12;:10;:12::i;:::-;55893:23;;:7;:23;;;55885:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;55981:26;55993:4;55999:7;55981:11;:26::i;:::-;55797:218;;:::o;68306:75::-;58243:40;58081:30;58270:12;:10;:12::i;:::-;58243:7;:40::i;:::-;58235:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;68364:9:::1;68370:2;68364:5;:9::i;:::-;68306:75:::0;:::o;25017:185::-;25155:39;25172:4;25178:2;25182:7;25155:39;;;;;;;;;;;;:16;:39::i;:::-;25017:185;;;:::o;58037:74::-;58081:30;58037:74;:::o;36715:233::-;36790:7;36826:30;:28;:30::i;:::-;36818:5;:38;36810:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;36923:10;36934:5;36923:17;;;;;;;;:::i;:::-;;;;;;;;;;36916:24;;36715:233;;;:::o;68665:105::-;58243:40;58081:30;58270:12;:10;:12::i;:::-;58243:7;:40::i;:::-;58235:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;68758:4:::1;68735:10;:20;68746:8;68735:20;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;68665:105:::0;:::o;69021:113::-;69079:7;69106:10;:20;69117:8;69106:20;;;;;;;;;;;;69099:27;;69021:113;;;:::o;70520:110::-;58243:40;58081:30;58270:12;:10;:12::i;:::-;58243:7;:40::i;:::-;58235:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;70609:13:::1;70599:7;:23;;;;;;;;;;;;:::i;:::-;;70520:110:::0;:::o;21992:239::-;22064:7;22084:13;22100:7;:16;22108:7;22100:16;;;;;;;;;;;;;;;;;;;;;22084:32;;22152:1;22135:19;;:5;:19;;;;22127:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22218:5;22211:12;;;21992:239;;;:::o;66968:20::-;;;;;;;;;;;;;:::o;66707:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21722:208::-;21794:7;21839:1;21822:19;;:5;:19;;;;21814:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21906:9;:16;21916:5;21906:16;;;;;;;;;;;;;;;;21899:23;;21722:208;;;:::o;70184:188::-;58243:40;58081:30;58270:12;:10;:12::i;:::-;58243:7;:40::i;:::-;58235:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;70298:15:::1;70266:14;;:48;;;;;;;;;;;;;;;;;;70330:34;70348:15;70330:34;;;;;;:::i;:::-;;;;;;;;70184:188:::0;:::o;68778:108::-;58243:40;58081:30;58270:12;:10;:12::i;:::-;58243:7;:40::i;:::-;58235:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;68873:5:::1;68850:10;:20;68861:8;68850:20;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;68778:108:::0;:::o;53249:139::-;53327:4;53351:6;:12;53358:4;53351:12;;;;;;;;;;;:20;;:29;53372:7;53351:29;;;;;;;;;;;;;;;;;;;;;;;;;53344:36;;53249:139;;;;:::o;66820:45::-;;;;;;;;;;;;;;;;;:::o;22467:104::-;22523:13;22556:7;22549:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22467:104;:::o;52340:49::-;52385:4;52340:49;;;:::o;24150:155::-;24245:52;24264:12;:10;:12::i;:::-;24278:8;24288;24245:18;:52::i;:::-;24150:155;;:::o;66925:36::-;;;;;;;;;;;;;:::o;59113:124::-;59169:4;59193:36;58163:31;59221:7;59193;:36::i;:::-;59186:43;;59113:124;;;:::o;58812:181::-;58885:6;58881:105;58901:7;:14;58897:1;:18;58881:105;;;58935:41;58163:31;58965:7;58973:1;58965:10;;;;;;;;:::i;:::-;;;;;;;;58935:9;:41::i;:::-;58917:3;;;;;:::i;:::-;;;;58881:105;;;;58812:181;:::o;25273:328::-;25448:41;25467:12;:10;:12::i;:::-;25481:7;25448:18;:41::i;:::-;25440:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25554:39;25568:4;25574:2;25578:7;25587:5;25554:13;:39::i;:::-;25273:328;;;;:::o;69660:392::-;69726:13;69811:17;69819:8;69811:7;:17::i;:::-;69803:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;69906:1;69888:7;69882:21;;;;;:::i;:::-;;;:25;:162;;;;;;;;;;;;;;;;;69965:7;69991:19;:8;:17;:19::i;:::-;69930:95;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69882:162;69875:169;;69660:392;;;:::o;55141:149::-;55225:18;55238:4;55225:12;:18::i;:::-;52831:30;52842:4;52848:12;:10;:12::i;:::-;52831:10;:30::i;:::-;55256:26:::1;55268:4;55274:7;55256:11;:26::i;:::-;55141:149:::0;;;:::o;59245:100::-;59301:36;58081:30;59330:6;59301:9;:36::i;:::-;59245:100;:::o;24376:164::-;24473:4;24497:18;:25;24516:5;24497:25;;;;;;;;;;;;;;;:35;24523:8;24497:35;;;;;;;;;;;;;;;;;;;;;;;;;24490:42;;24376:164;;;;:::o;66735:27::-;;;;:::o;70380:132::-;58243:40;58081:30;58270:12;:10;:12::i;:::-;58243:7;:40::i;:::-;58235:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;70462:7:::1;70446:6;;:24;;;;;;;;;;;;;;;;;;70486:18;70496:7;70486:18;;;;;;:::i;:::-;;;;;;;;70380:132:::0;:::o;67628:670::-;67717:1;67698:9;:16;:20;67690:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67808:1;67777:6;;;;;;;;;;;:16;;;67794:10;67777:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:32;67769:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;67868:9;67864:427;67887:9;:16;67883:1;:20;67864:427;;;67963:10;67931:42;;:6;;;;;;;;;;;:14;;;67946:9;67956:1;67946:12;;;;;;;;:::i;:::-;;;;;;;;67931:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:42;;;67923:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;68032:14;;;;;;;;;;;:24;;;68057:9;68067:1;68057:12;;;;;;;;:::i;:::-;;;;;;;;68032:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68024:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;68134:10;:24;68145:9;68155:1;68145:12;;;;;;;;:::i;:::-;;;;;;;;68134:24;;;;;;;;;;;;;;;;;;;;;68133:25;68125:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;68245:4;68218:10;:24;68229:9;68239:1;68229:12;;;;;;;;:::i;:::-;;;;;;;;68218:24;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;68262:17;68268:10;68262:5;:17::i;:::-;67905:3;;;;;:::i;:::-;;;;67864:427;;;;67628:670;:::o;58118:76::-;58163:31;58118:76;:::o;35885:224::-;35987:4;36026:35;36011:50;;;:11;:50;;;;:90;;;;36065:36;36089:11;36065:23;:36::i;:::-;36011:90;36004:97;;35885:224;;;:::o;52953:204::-;53038:4;53077:32;53062:47;;;:11;:47;;;;:87;;;;53113:36;53137:11;53113:23;:36::i;:::-;53062:87;53055:94;;52953:204;;;:::o;27111:127::-;27176:4;27228:1;27200:30;;:7;:16;27208:7;27200:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27193:37;;27111:127;;;:::o;16580:98::-;16633:7;16660:10;16653:17;;16580:98;:::o;31093:174::-;31195:2;31168:15;:24;31184:7;31168:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31251:7;31247:2;31213:46;;31222:23;31237:7;31222:14;:23::i;:::-;31213:46;;;;;;;;;;;;31093:174;;:::o;27405:348::-;27498:4;27523:16;27531:7;27523;:16::i;:::-;27515:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27599:13;27615:23;27630:7;27615:14;:23::i;:::-;27599:39;;27668:5;27657:16;;:7;:16;;;:51;;;;27701:7;27677:31;;:20;27689:7;27677:11;:20::i;:::-;:31;;;27657:51;:87;;;;27712:32;27729:5;27736:7;27712:16;:32::i;:::-;27657:87;27649:96;;;27405:348;;;;:::o;30397:578::-;30556:4;30529:31;;:23;30544:7;30529:14;:23::i;:::-;:31;;;30521:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30639:1;30625:16;;:2;:16;;;;30617:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30695:39;30716:4;30722:2;30726:7;30695:20;:39::i;:::-;30799:29;30816:1;30820:7;30799:8;:29::i;:::-;30860:1;30841:9;:15;30851:4;30841:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30889:1;30872:9;:13;30882:2;30872:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30920:2;30901:7;:16;30909:7;30901:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30959:7;30955:2;30940:27;;30949:4;30940:27;;;;;;;;;;;;30397:578;;;:::o;53678:497::-;53759:22;53767:4;53773:7;53759;:22::i;:::-;53754:414;;53947:41;53975:7;53947:41;;53985:2;53947:19;:41::i;:::-;54061:38;54089:4;54081:13;;54096:2;54061:19;:38::i;:::-;53852:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53798:358;;;;;;;;;;;:::i;:::-;;;;;;;;53754:414;53678:497;;:::o;57298:238::-;57382:22;57390:4;57396:7;57382;:22::i;:::-;57377:152;;57453:4;57421:6;:12;57428:4;57421:12;;;;;;;;;;;:20;;:29;57442:7;57421:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;57504:12;:10;:12::i;:::-;57477:40;;57495:7;57477:40;;57489:4;57477:40;;;;;;;;;;57377:152;57298:238;;:::o;57668:239::-;57752:22;57760:4;57766:7;57752;:22::i;:::-;57748:152;;;57823:5;57791:6;:12;57798:4;57791:12;;;;;;;;;;;:20;;:29;57812:7;57791:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;57875:12;:10;:12::i;:::-;57848:40;;57866:7;57848:40;;57860:4;57848:40;;;;;;;;;;57748:152;57668:239;;:::o;68389:266::-;68437:16;68475:25;:15;:23;:25::i;:::-;68464:36;;68511:27;:15;:25;:27::i;:::-;68572:1;68549:10;:20;68560:8;68549:20;;;;;;;;;;;:24;;;;68584;68594:3;68599:8;68584:9;:24::i;:::-;68633:3;68624:23;;;68638:8;68624:23;;;;;;:::i;:::-;;;;;;;;68426:229;68389:266;:::o;31409:315::-;31564:8;31555:17;;:5;:17;;;;31547:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;31651:8;31613:18;:25;31632:5;31613:25;;;;;;;;;;;;;;;:35;31639:8;31613:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;31697:8;31675:41;;31690:5;31675:41;;;31707:8;31675:41;;;;;;:::i;:::-;;;;;;;;31409:315;;;:::o;26483:::-;26640:28;26650:4;26656:2;26660:7;26640:9;:28::i;:::-;26687:48;26710:4;26716:2;26720:7;26729:5;26687:22;:48::i;:::-;26679:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26483:315;;;;:::o;17165:723::-;17221:13;17451:1;17442:5;:10;17438:53;;;17469:10;;;;;;;;;;;;;;;;;;;;;17438:53;17501:12;17516:5;17501:20;;17532:14;17557:78;17572:1;17564:4;:9;17557:78;;17590:8;;;;;:::i;:::-;;;;17621:2;17613:10;;;;;:::i;:::-;;;17557:78;;;17645:19;17677:6;17667:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17645:39;;17695:154;17711:1;17702:5;:10;17695:154;;17739:1;17729:11;;;;;:::i;:::-;;;17806:2;17798:5;:10;;;;:::i;:::-;17785:2;:24;;;;:::i;:::-;17772:39;;17755:6;17762;17755:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17835:2;17826:11;;;;;:::i;:::-;;;17695:154;;;17873:6;17859:21;;;;;17165:723;;;;:::o;21353:305::-;21455:4;21507:25;21492:40;;;:11;:40;;;;:105;;;;21564:33;21549:48;;;:11;:48;;;;21492:105;:158;;;;21614:36;21638:11;21614:23;:36::i;:::-;21492:158;21472:178;;21353:305;;;:::o;19793:157::-;19878:4;19917:25;19902:40;;;:11;:40;;;;19895:47;;19793:157;;;:::o;69384:268::-;69523:48;69550:5;69557:3;69562:8;69523:26;:48::i;:::-;69614:5;69590:29;;:10;:20;69601:8;69590:20;;;;;;;;;;;;;;;;;;;;;:29;;;69582:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;69384:268;;;:::o;18466:451::-;18541:13;18567:19;18612:1;18603:6;18599:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;18589:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18567:47;;18625:15;:6;18632:1;18625:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;18651;:6;18658:1;18651:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;18682:9;18707:1;18698:6;18694:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;18682:26;;18677:135;18714:1;18710;:5;18677:135;;;18749:12;18770:3;18762:5;:11;18749:25;;;;;;;:::i;:::-;;;;;18737:6;18744:1;18737:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;18799:1;18789:11;;;;;18717:3;;;;:::i;:::-;;;18677:135;;;;18839:1;18830:5;:10;18822:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;18902:6;18888:21;;;18466:451;;;;:::o;44199:114::-;44264:7;44291;:14;;;44284:21;;44199:114;;;:::o;44321:127::-;44428:1;44410:7;:14;;;:19;;;;;;;;;;;44321:127;:::o;28095:110::-;28171:26;28181:2;28185:7;28171:26;;;;;;;;;;;;:9;:26::i;:::-;28095:110;;:::o;32289:799::-;32444:4;32465:15;:2;:13;;;:15::i;:::-;32461:620;;;32517:2;32501:36;;;32538:12;:10;:12::i;:::-;32552:4;32558:7;32567:5;32501:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32497:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32760:1;32743:6;:13;:18;32739:272;;;32786:60;;;;;;;;;;:::i;:::-;;;;;;;;32739:272;32961:6;32955:13;32946:6;32942:2;32938:15;32931:38;32497:529;32634:41;;;32624:51;;;:6;:51;;;;32617:58;;;;;32461:620;33065:4;33058:11;;32289:799;;;;;;;:::o;37561:589::-;37705:45;37732:4;37738:2;37742:7;37705:26;:45::i;:::-;37783:1;37767:18;;:4;:18;;;37763:187;;;37802:40;37834:7;37802:31;:40::i;:::-;37763:187;;;37872:2;37864:10;;:4;:10;;;37860:90;;37891:47;37924:4;37930:7;37891:32;:47::i;:::-;37860:90;37763:187;37978:1;37964:16;;:2;:16;;;37960:183;;;37997:45;38034:7;37997:36;:45::i;:::-;37960:183;;;38070:4;38064:10;;:2;:10;;;38060:83;;38091:40;38119:2;38123:7;38091:27;:40::i;:::-;38060:83;37960:183;37561:589;;;:::o;28432:321::-;28562:18;28568:2;28572:7;28562:5;:18::i;:::-;28613:54;28644:1;28648:2;28652:7;28661:5;28613:22;:54::i;:::-;28591:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;28432:321;;;:::o;8564:387::-;8624:4;8832:12;8899:7;8887:20;8879:28;;8942:1;8935:4;:8;8928:15;;;8564:387;;;:::o;33660:126::-;;;;:::o;38873:164::-;38977:10;:17;;;;38950:15;:24;38966:7;38950:24;;;;;;;;;;;:44;;;;39005:10;39021:7;39005:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38873:164;:::o;39664:988::-;39930:22;39980:1;39955:22;39972:4;39955:16;:22::i;:::-;:26;;;;:::i;:::-;39930:51;;39992:18;40013:17;:26;40031:7;40013:26;;;;;;;;;;;;39992:47;;40160:14;40146:10;:28;40142:328;;40191:19;40213:12;:18;40226:4;40213:18;;;;;;;;;;;;;;;:34;40232:14;40213:34;;;;;;;;;;;;40191:56;;40297:11;40264:12;:18;40277:4;40264:18;;;;;;;;;;;;;;;:30;40283:10;40264:30;;;;;;;;;;;:44;;;;40414:10;40381:17;:30;40399:11;40381:30;;;;;;;;;;;:43;;;;40176:294;40142:328;40566:17;:26;40584:7;40566:26;;;;;;;;;;;40559:33;;;40610:12;:18;40623:4;40610:18;;;;;;;;;;;;;;;:34;40629:14;40610:34;;;;;;;;;;;40603:41;;;39745:907;;39664:988;;:::o;40947:1079::-;41200:22;41245:1;41225:10;:17;;;;:21;;;;:::i;:::-;41200:46;;41257:18;41278:15;:24;41294:7;41278:24;;;;;;;;;;;;41257:45;;41629:19;41651:10;41662:14;41651:26;;;;;;;;:::i;:::-;;;;;;;;;;41629:48;;41715:11;41690:10;41701;41690:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;41826:10;41795:15;:28;41811:11;41795:28;;;;;;;;;;;:41;;;;41967:15;:24;41983:7;41967:24;;;;;;;;;;;41960:31;;;42002:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41018:1008;;;40947:1079;:::o;38451:221::-;38536:14;38553:20;38570:2;38553:16;:20::i;:::-;38536:37;;38611:7;38584:12;:16;38597:2;38584:16;;;;;;;;;;;;;;;:24;38601:6;38584:24;;;;;;;;;;;:34;;;;38658:6;38629:17;:26;38647:7;38629:26;;;;;;;;;;;:35;;;;38525:147;38451:221;;:::o;29089:382::-;29183:1;29169:16;;:2;:16;;;;29161:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29242:16;29250:7;29242;:16::i;:::-;29241:17;29233:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29304:45;29333:1;29337:2;29341:7;29304:20;:45::i;:::-;29379:1;29362:9;:13;29372:2;29362:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29410:2;29391:7;:16;29399:7;29391:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29455:7;29451:2;29430:33;;29447:1;29430:33;;;;;;;;;;;;29089:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:410::-;1574:5;1599:65;1615:48;1656:6;1615:48;:::i;:::-;1599:65;:::i;:::-;1590:74;;1687:6;1680:5;1673:21;1725:4;1718:5;1714:16;1763:3;1754:6;1749:3;1745:16;1742:25;1739:112;;;1770:79;;:::i;:::-;1739:112;1860:41;1894:6;1889:3;1884;1860:41;:::i;:::-;1580:327;1497:410;;;;;:::o;1913:412::-;1991:5;2016:66;2032:49;2074:6;2032:49;:::i;:::-;2016:66;:::i;:::-;2007:75;;2105:6;2098:5;2091:21;2143:4;2136:5;2132:16;2181:3;2172:6;2167:3;2163:16;2160:25;2157:112;;;2188:79;;:::i;:::-;2157:112;2278:41;2312:6;2307:3;2302;2278:41;:::i;:::-;1997:328;1913:412;;;;;:::o;2331:139::-;2377:5;2415:6;2402:20;2393:29;;2431:33;2458:5;2431:33;:::i;:::-;2331:139;;;;:::o;2476:143::-;2533:5;2564:6;2558:13;2549:22;;2580:33;2607:5;2580:33;:::i;:::-;2476:143;;;;:::o;2642:370::-;2713:5;2762:3;2755:4;2747:6;2743:17;2739:27;2729:122;;2770:79;;:::i;:::-;2729:122;2887:6;2874:20;2912:94;3002:3;2994:6;2987:4;2979:6;2975:17;2912:94;:::i;:::-;2903:103;;2719:293;2642:370;;;;:::o;3035:::-;3106:5;3155:3;3148:4;3140:6;3136:17;3132:27;3122:122;;3163:79;;:::i;:::-;3122:122;3280:6;3267:20;3305:94;3395:3;3387:6;3380:4;3372:6;3368:17;3305:94;:::i;:::-;3296:103;;3112:293;3035:370;;;;:::o;3411:133::-;3454:5;3492:6;3479:20;3470:29;;3508:30;3532:5;3508:30;:::i;:::-;3411:133;;;;:::o;3550:137::-;3604:5;3635:6;3629:13;3620:22;;3651:30;3675:5;3651:30;:::i;:::-;3550:137;;;;:::o;3693:139::-;3739:5;3777:6;3764:20;3755:29;;3793:33;3820:5;3793:33;:::i;:::-;3693:139;;;;:::o;3838:137::-;3883:5;3921:6;3908:20;3899:29;;3937:32;3963:5;3937:32;:::i;:::-;3838:137;;;;:::o;3981:141::-;4037:5;4068:6;4062:13;4053:22;;4084:32;4110:5;4084:32;:::i;:::-;3981:141;;;;:::o;4141:338::-;4196:5;4245:3;4238:4;4230:6;4226:17;4222:27;4212:122;;4253:79;;:::i;:::-;4212:122;4370:6;4357:20;4395:78;4469:3;4461:6;4454:4;4446:6;4442:17;4395:78;:::i;:::-;4386:87;;4202:277;4141:338;;;;:::o;4499:340::-;4555:5;4604:3;4597:4;4589:6;4585:17;4581:27;4571:122;;4612:79;;:::i;:::-;4571:122;4729:6;4716:20;4754:79;4829:3;4821:6;4814:4;4806:6;4802:17;4754:79;:::i;:::-;4745:88;;4561:278;4499:340;;;;:::o;4845:139::-;4891:5;4929:6;4916:20;4907:29;;4945:33;4972:5;4945:33;:::i;:::-;4845:139;;;;:::o;4990:143::-;5047:5;5078:6;5072:13;5063:22;;5094:33;5121:5;5094:33;:::i;:::-;4990:143;;;;:::o;5139:329::-;5198:6;5247:2;5235:9;5226:7;5222:23;5218:32;5215:119;;;5253:79;;:::i;:::-;5215:119;5373:1;5398:53;5443:7;5434:6;5423:9;5419:22;5398:53;:::i;:::-;5388:63;;5344:117;5139:329;;;;:::o;5474:351::-;5544:6;5593:2;5581:9;5572:7;5568:23;5564:32;5561:119;;;5599:79;;:::i;:::-;5561:119;5719:1;5744:64;5800:7;5791:6;5780:9;5776:22;5744:64;:::i;:::-;5734:74;;5690:128;5474:351;;;;:::o;5831:474::-;5899:6;5907;5956:2;5944:9;5935:7;5931:23;5927:32;5924:119;;;5962:79;;:::i;:::-;5924:119;6082:1;6107:53;6152:7;6143:6;6132:9;6128:22;6107:53;:::i;:::-;6097:63;;6053:117;6209:2;6235:53;6280:7;6271:6;6260:9;6256:22;6235:53;:::i;:::-;6225:63;;6180:118;5831:474;;;;;:::o;6311:619::-;6388:6;6396;6404;6453:2;6441:9;6432:7;6428:23;6424:32;6421:119;;;6459:79;;:::i;:::-;6421:119;6579:1;6604:53;6649:7;6640:6;6629:9;6625:22;6604:53;:::i;:::-;6594:63;;6550:117;6706:2;6732:53;6777:7;6768:6;6757:9;6753:22;6732:53;:::i;:::-;6722:63;;6677:118;6834:2;6860:53;6905:7;6896:6;6885:9;6881:22;6860:53;:::i;:::-;6850:63;;6805:118;6311:619;;;;;:::o;6936:943::-;7031:6;7039;7047;7055;7104:3;7092:9;7083:7;7079:23;7075:33;7072:120;;;7111:79;;:::i;:::-;7072:120;7231:1;7256:53;7301:7;7292:6;7281:9;7277:22;7256:53;:::i;:::-;7246:63;;7202:117;7358:2;7384:53;7429:7;7420:6;7409:9;7405:22;7384:53;:::i;:::-;7374:63;;7329:118;7486:2;7512:53;7557:7;7548:6;7537:9;7533:22;7512:53;:::i;:::-;7502:63;;7457:118;7642:2;7631:9;7627:18;7614:32;7673:18;7665:6;7662:30;7659:117;;;7695:79;;:::i;:::-;7659:117;7800:62;7854:7;7845:6;7834:9;7830:22;7800:62;:::i;:::-;7790:72;;7585:287;6936:943;;;;;;;:::o;7885:468::-;7950:6;7958;8007:2;7995:9;7986:7;7982:23;7978:32;7975:119;;;8013:79;;:::i;:::-;7975:119;8133:1;8158:53;8203:7;8194:6;8183:9;8179:22;8158:53;:::i;:::-;8148:63;;8104:117;8260:2;8286:50;8328:7;8319:6;8308:9;8304:22;8286:50;:::i;:::-;8276:60;;8231:115;7885:468;;;;;:::o;8359:474::-;8427:6;8435;8484:2;8472:9;8463:7;8459:23;8455:32;8452:119;;;8490:79;;:::i;:::-;8452:119;8610:1;8635:53;8680:7;8671:6;8660:9;8656:22;8635:53;:::i;:::-;8625:63;;8581:117;8737:2;8763:53;8808:7;8799:6;8788:9;8784:22;8763:53;:::i;:::-;8753:63;;8708:118;8359:474;;;;;:::o;8839:539::-;8923:6;8972:2;8960:9;8951:7;8947:23;8943:32;8940:119;;;8978:79;;:::i;:::-;8940:119;9126:1;9115:9;9111:17;9098:31;9156:18;9148:6;9145:30;9142:117;;;9178:79;;:::i;:::-;9142:117;9283:78;9353:7;9344:6;9333:9;9329:22;9283:78;:::i;:::-;9273:88;;9069:302;8839:539;;;;:::o;9384:::-;9468:6;9517:2;9505:9;9496:7;9492:23;9488:32;9485:119;;;9523:79;;:::i;:::-;9485:119;9671:1;9660:9;9656:17;9643:31;9701:18;9693:6;9690:30;9687:117;;;9723:79;;:::i;:::-;9687:117;9828:78;9898:7;9889:6;9878:9;9874:22;9828:78;:::i;:::-;9818:88;;9614:302;9384:539;;;;:::o;9929:345::-;9996:6;10045:2;10033:9;10024:7;10020:23;10016:32;10013:119;;;10051:79;;:::i;:::-;10013:119;10171:1;10196:61;10249:7;10240:6;10229:9;10225:22;10196:61;:::i;:::-;10186:71;;10142:125;9929:345;;;;:::o;10280:329::-;10339:6;10388:2;10376:9;10367:7;10363:23;10359:32;10356:119;;;10394:79;;:::i;:::-;10356:119;10514:1;10539:53;10584:7;10575:6;10564:9;10560:22;10539:53;:::i;:::-;10529:63;;10485:117;10280:329;;;;:::o;10615:474::-;10683:6;10691;10740:2;10728:9;10719:7;10715:23;10711:32;10708:119;;;10746:79;;:::i;:::-;10708:119;10866:1;10891:53;10936:7;10927:6;10916:9;10912:22;10891:53;:::i;:::-;10881:63;;10837:117;10993:2;11019:53;11064:7;11055:6;11044:9;11040:22;11019:53;:::i;:::-;11009:63;;10964:118;10615:474;;;;;:::o;11095:327::-;11153:6;11202:2;11190:9;11181:7;11177:23;11173:32;11170:119;;;11208:79;;:::i;:::-;11170:119;11328:1;11353:52;11397:7;11388:6;11377:9;11373:22;11353:52;:::i;:::-;11343:62;;11299:116;11095:327;;;;:::o;11428:349::-;11497:6;11546:2;11534:9;11525:7;11521:23;11517:32;11514:119;;;11552:79;;:::i;:::-;11514:119;11672:1;11697:63;11752:7;11743:6;11732:9;11728:22;11697:63;:::i;:::-;11687:73;;11643:127;11428:349;;;;:::o;11783:509::-;11852:6;11901:2;11889:9;11880:7;11876:23;11872:32;11869:119;;;11907:79;;:::i;:::-;11869:119;12055:1;12044:9;12040:17;12027:31;12085:18;12077:6;12074:30;12071:117;;;12107:79;;:::i;:::-;12071:117;12212:63;12267:7;12258:6;12247:9;12243:22;12212:63;:::i;:::-;12202:73;;11998:287;11783:509;;;;:::o;12298:329::-;12357:6;12406:2;12394:9;12385:7;12381:23;12377:32;12374:119;;;12412:79;;:::i;:::-;12374:119;12532:1;12557:53;12602:7;12593:6;12582:9;12578:22;12557:53;:::i;:::-;12547:63;;12503:117;12298:329;;;;:::o;12633:351::-;12703:6;12752:2;12740:9;12731:7;12727:23;12723:32;12720:119;;;12758:79;;:::i;:::-;12720:119;12878:1;12903:64;12959:7;12950:6;12939:9;12935:22;12903:64;:::i;:::-;12893:74;;12849:128;12633:351;;;;:::o;12990:474::-;13058:6;13066;13115:2;13103:9;13094:7;13090:23;13086:32;13083:119;;;13121:79;;:::i;:::-;13083:119;13241:1;13266:53;13311:7;13302:6;13291:9;13287:22;13266:53;:::i;:::-;13256:63;;13212:117;13368:2;13394:53;13439:7;13430:6;13419:9;13415:22;13394:53;:::i;:::-;13384:63;;13339:118;12990:474;;;;;:::o;13470:118::-;13557:24;13575:5;13557:24;:::i;:::-;13552:3;13545:37;13470:118;;:::o;13594:109::-;13675:21;13690:5;13675:21;:::i;:::-;13670:3;13663:34;13594:109;;:::o;13709:118::-;13796:24;13814:5;13796:24;:::i;:::-;13791:3;13784:37;13709:118;;:::o;13833:360::-;13919:3;13947:38;13979:5;13947:38;:::i;:::-;14001:70;14064:6;14059:3;14001:70;:::i;:::-;13994:77;;14080:52;14125:6;14120:3;14113:4;14106:5;14102:16;14080:52;:::i;:::-;14157:29;14179:6;14157:29;:::i;:::-;14152:3;14148:39;14141:46;;13923:270;13833:360;;;;:::o;14199:161::-;14301:52;14347:5;14301:52;:::i;:::-;14296:3;14289:65;14199:161;;:::o;14366:177::-;14476:60;14530:5;14476:60;:::i;:::-;14471:3;14464:73;14366:177;;:::o;14549:364::-;14637:3;14665:39;14698:5;14665:39;:::i;:::-;14720:71;14784:6;14779:3;14720:71;:::i;:::-;14713:78;;14800:52;14845:6;14840:3;14833:4;14826:5;14822:16;14800:52;:::i;:::-;14877:29;14899:6;14877:29;:::i;:::-;14872:3;14868:39;14861:46;;14641:272;14549:364;;;;:::o;14919:377::-;15025:3;15053:39;15086:5;15053:39;:::i;:::-;15108:89;15190:6;15185:3;15108:89;:::i;:::-;15101:96;;15206:52;15251:6;15246:3;15239:4;15232:5;15228:16;15206:52;:::i;:::-;15283:6;15278:3;15274:16;15267:23;;15029:267;14919:377;;;;:::o;15326:845::-;15429:3;15466:5;15460:12;15495:36;15521:9;15495:36;:::i;:::-;15547:89;15629:6;15624:3;15547:89;:::i;:::-;15540:96;;15667:1;15656:9;15652:17;15683:1;15678:137;;;;15829:1;15824:341;;;;15645:520;;15678:137;15762:4;15758:9;15747;15743:25;15738:3;15731:38;15798:6;15793:3;15789:16;15782:23;;15678:137;;15824:341;15891:38;15923:5;15891:38;:::i;:::-;15951:1;15965:154;15979:6;15976:1;15973:13;15965:154;;;16053:7;16047:14;16043:1;16038:3;16034:11;16027:35;16103:1;16094:7;16090:15;16079:26;;16001:4;15998:1;15994:12;15989:17;;15965:154;;;16148:6;16143:3;16139:16;16132:23;;15831:334;;15645:520;;15433:738;;15326:845;;;;:::o;16177:366::-;16319:3;16340:67;16404:2;16399:3;16340:67;:::i;:::-;16333:74;;16416:93;16505:3;16416:93;:::i;:::-;16534:2;16529:3;16525:12;16518:19;;16177:366;;;:::o;16549:::-;16691:3;16712:67;16776:2;16771:3;16712:67;:::i;:::-;16705:74;;16788:93;16877:3;16788:93;:::i;:::-;16906:2;16901:3;16897:12;16890:19;;16549:366;;;:::o;16921:::-;17063:3;17084:67;17148:2;17143:3;17084:67;:::i;:::-;17077:74;;17160:93;17249:3;17160:93;:::i;:::-;17278:2;17273:3;17269:12;17262:19;;16921:366;;;:::o;17293:::-;17435:3;17456:67;17520:2;17515:3;17456:67;:::i;:::-;17449:74;;17532:93;17621:3;17532:93;:::i;:::-;17650:2;17645:3;17641:12;17634:19;;17293:366;;;:::o;17665:::-;17807:3;17828:67;17892:2;17887:3;17828:67;:::i;:::-;17821:74;;17904:93;17993:3;17904:93;:::i;:::-;18022:2;18017:3;18013:12;18006:19;;17665:366;;;:::o;18037:::-;18179:3;18200:67;18264:2;18259:3;18200:67;:::i;:::-;18193:74;;18276:93;18365:3;18276:93;:::i;:::-;18394:2;18389:3;18385:12;18378:19;;18037:366;;;:::o;18409:::-;18551:3;18572:67;18636:2;18631:3;18572:67;:::i;:::-;18565:74;;18648:93;18737:3;18648:93;:::i;:::-;18766:2;18761:3;18757:12;18750:19;;18409:366;;;:::o;18781:::-;18923:3;18944:67;19008:2;19003:3;18944:67;:::i;:::-;18937:74;;19020:93;19109:3;19020:93;:::i;:::-;19138:2;19133:3;19129:12;19122:19;;18781:366;;;:::o;19153:::-;19295:3;19316:67;19380:2;19375:3;19316:67;:::i;:::-;19309:74;;19392:93;19481:3;19392:93;:::i;:::-;19510:2;19505:3;19501:12;19494:19;;19153:366;;;:::o;19525:::-;19667:3;19688:67;19752:2;19747:3;19688:67;:::i;:::-;19681:74;;19764:93;19853:3;19764:93;:::i;:::-;19882:2;19877:3;19873:12;19866:19;;19525:366;;;:::o;19897:::-;20039:3;20060:67;20124:2;20119:3;20060:67;:::i;:::-;20053:74;;20136:93;20225:3;20136:93;:::i;:::-;20254:2;20249:3;20245:12;20238:19;;19897:366;;;:::o;20269:::-;20411:3;20432:67;20496:2;20491:3;20432:67;:::i;:::-;20425:74;;20508:93;20597:3;20508:93;:::i;:::-;20626:2;20621:3;20617:12;20610:19;;20269:366;;;:::o;20641:::-;20783:3;20804:67;20868:2;20863:3;20804:67;:::i;:::-;20797:74;;20880:93;20969:3;20880:93;:::i;:::-;20998:2;20993:3;20989:12;20982:19;;20641:366;;;:::o;21013:::-;21155:3;21176:67;21240:2;21235:3;21176:67;:::i;:::-;21169:74;;21252:93;21341:3;21252:93;:::i;:::-;21370:2;21365:3;21361:12;21354:19;;21013:366;;;:::o;21385:::-;21527:3;21548:67;21612:2;21607:3;21548:67;:::i;:::-;21541:74;;21624:93;21713:3;21624:93;:::i;:::-;21742:2;21737:3;21733:12;21726:19;;21385:366;;;:::o;21757:::-;21899:3;21920:67;21984:2;21979:3;21920:67;:::i;:::-;21913:74;;21996:93;22085:3;21996:93;:::i;:::-;22114:2;22109:3;22105:12;22098:19;;21757:366;;;:::o;22129:::-;22271:3;22292:67;22356:2;22351:3;22292:67;:::i;:::-;22285:74;;22368:93;22457:3;22368:93;:::i;:::-;22486:2;22481:3;22477:12;22470:19;;22129:366;;;:::o;22501:::-;22643:3;22664:67;22728:2;22723:3;22664:67;:::i;:::-;22657:74;;22740:93;22829:3;22740:93;:::i;:::-;22858:2;22853:3;22849:12;22842:19;;22501:366;;;:::o;22873:::-;23015:3;23036:67;23100:2;23095:3;23036:67;:::i;:::-;23029:74;;23112:93;23201:3;23112:93;:::i;:::-;23230:2;23225:3;23221:12;23214:19;;22873:366;;;:::o;23245:::-;23387:3;23408:67;23472:2;23467:3;23408:67;:::i;:::-;23401:74;;23484:93;23573:3;23484:93;:::i;:::-;23602:2;23597:3;23593:12;23586:19;;23245:366;;;:::o;23617:::-;23759:3;23780:67;23844:2;23839:3;23780:67;:::i;:::-;23773:74;;23856:93;23945:3;23856:93;:::i;:::-;23974:2;23969:3;23965:12;23958:19;;23617:366;;;:::o;23989:::-;24131:3;24152:67;24216:2;24211:3;24152:67;:::i;:::-;24145:74;;24228:93;24317:3;24228:93;:::i;:::-;24346:2;24341:3;24337:12;24330:19;;23989:366;;;:::o;24361:402::-;24521:3;24542:85;24624:2;24619:3;24542:85;:::i;:::-;24535:92;;24636:93;24725:3;24636:93;:::i;:::-;24754:2;24749:3;24745:12;24738:19;;24361:402;;;:::o;24769:366::-;24911:3;24932:67;24996:2;24991:3;24932:67;:::i;:::-;24925:74;;25008:93;25097:3;25008:93;:::i;:::-;25126:2;25121:3;25117:12;25110:19;;24769:366;;;:::o;25141:402::-;25301:3;25322:85;25404:2;25399:3;25322:85;:::i;:::-;25315:92;;25416:93;25505:3;25416:93;:::i;:::-;25534:2;25529:3;25525:12;25518:19;;25141:402;;;:::o;25549:366::-;25691:3;25712:67;25776:2;25771:3;25712:67;:::i;:::-;25705:74;;25788:93;25877:3;25788:93;:::i;:::-;25906:2;25901:3;25897:12;25890:19;;25549:366;;;:::o;25921:::-;26063:3;26084:67;26148:2;26143:3;26084:67;:::i;:::-;26077:74;;26160:93;26249:3;26160:93;:::i;:::-;26278:2;26273:3;26269:12;26262:19;;25921:366;;;:::o;26293:118::-;26380:24;26398:5;26380:24;:::i;:::-;26375:3;26368:37;26293:118;;:::o;26417:429::-;26594:3;26616:92;26704:3;26695:6;26616:92;:::i;:::-;26609:99;;26725:95;26816:3;26807:6;26725:95;:::i;:::-;26718:102;;26837:3;26830:10;;26417:429;;;;;:::o;26852:967::-;27234:3;27256:148;27400:3;27256:148;:::i;:::-;27249:155;;27421:95;27512:3;27503:6;27421:95;:::i;:::-;27414:102;;27533:148;27677:3;27533:148;:::i;:::-;27526:155;;27698:95;27789:3;27780:6;27698:95;:::i;:::-;27691:102;;27810:3;27803:10;;26852:967;;;;;:::o;27825:222::-;27918:4;27956:2;27945:9;27941:18;27933:26;;27969:71;28037:1;28026:9;28022:17;28013:6;27969:71;:::i;:::-;27825:222;;;;:::o;28053:640::-;28248:4;28286:3;28275:9;28271:19;28263:27;;28300:71;28368:1;28357:9;28353:17;28344:6;28300:71;:::i;:::-;28381:72;28449:2;28438:9;28434:18;28425:6;28381:72;:::i;:::-;28463;28531:2;28520:9;28516:18;28507:6;28463:72;:::i;:::-;28582:9;28576:4;28572:20;28567:2;28556:9;28552:18;28545:48;28610:76;28681:4;28672:6;28610:76;:::i;:::-;28602:84;;28053:640;;;;;;;:::o;28699:210::-;28786:4;28824:2;28813:9;28809:18;28801:26;;28837:65;28899:1;28888:9;28884:17;28875:6;28837:65;:::i;:::-;28699:210;;;;:::o;28915:222::-;29008:4;29046:2;29035:9;29031:18;29023:26;;29059:71;29127:1;29116:9;29112:17;29103:6;29059:71;:::i;:::-;28915:222;;;;:::o;29143:252::-;29251:4;29289:2;29278:9;29274:18;29266:26;;29302:86;29385:1;29374:9;29370:17;29361:6;29302:86;:::i;:::-;29143:252;;;;:::o;29401:268::-;29517:4;29555:2;29544:9;29540:18;29532:26;;29568:94;29659:1;29648:9;29644:17;29635:6;29568:94;:::i;:::-;29401:268;;;;:::o;29675:313::-;29788:4;29826:2;29815:9;29811:18;29803:26;;29875:9;29869:4;29865:20;29861:1;29850:9;29846:17;29839:47;29903:78;29976:4;29967:6;29903:78;:::i;:::-;29895:86;;29675:313;;;;:::o;29994:419::-;30160:4;30198:2;30187:9;30183:18;30175:26;;30247:9;30241:4;30237:20;30233:1;30222:9;30218:17;30211:47;30275:131;30401:4;30275:131;:::i;:::-;30267:139;;29994:419;;;:::o;30419:::-;30585:4;30623:2;30612:9;30608:18;30600:26;;30672:9;30666:4;30662:20;30658:1;30647:9;30643:17;30636:47;30700:131;30826:4;30700:131;:::i;:::-;30692:139;;30419:419;;;:::o;30844:::-;31010:4;31048:2;31037:9;31033:18;31025:26;;31097:9;31091:4;31087:20;31083:1;31072:9;31068:17;31061:47;31125:131;31251:4;31125:131;:::i;:::-;31117:139;;30844:419;;;:::o;31269:::-;31435:4;31473:2;31462:9;31458:18;31450:26;;31522:9;31516:4;31512:20;31508:1;31497:9;31493:17;31486:47;31550:131;31676:4;31550:131;:::i;:::-;31542:139;;31269:419;;;:::o;31694:::-;31860:4;31898:2;31887:9;31883:18;31875:26;;31947:9;31941:4;31937:20;31933:1;31922:9;31918:17;31911:47;31975:131;32101:4;31975:131;:::i;:::-;31967:139;;31694:419;;;:::o;32119:::-;32285:4;32323:2;32312:9;32308:18;32300:26;;32372:9;32366:4;32362:20;32358:1;32347:9;32343:17;32336:47;32400:131;32526:4;32400:131;:::i;:::-;32392:139;;32119:419;;;:::o;32544:::-;32710:4;32748:2;32737:9;32733:18;32725:26;;32797:9;32791:4;32787:20;32783:1;32772:9;32768:17;32761:47;32825:131;32951:4;32825:131;:::i;:::-;32817:139;;32544:419;;;:::o;32969:::-;33135:4;33173:2;33162:9;33158:18;33150:26;;33222:9;33216:4;33212:20;33208:1;33197:9;33193:17;33186:47;33250:131;33376:4;33250:131;:::i;:::-;33242:139;;32969:419;;;:::o;33394:::-;33560:4;33598:2;33587:9;33583:18;33575:26;;33647:9;33641:4;33637:20;33633:1;33622:9;33618:17;33611:47;33675:131;33801:4;33675:131;:::i;:::-;33667:139;;33394:419;;;:::o;33819:::-;33985:4;34023:2;34012:9;34008:18;34000:26;;34072:9;34066:4;34062:20;34058:1;34047:9;34043:17;34036:47;34100:131;34226:4;34100:131;:::i;:::-;34092:139;;33819:419;;;:::o;34244:::-;34410:4;34448:2;34437:9;34433:18;34425:26;;34497:9;34491:4;34487:20;34483:1;34472:9;34468:17;34461:47;34525:131;34651:4;34525:131;:::i;:::-;34517:139;;34244:419;;;:::o;34669:::-;34835:4;34873:2;34862:9;34858:18;34850:26;;34922:9;34916:4;34912:20;34908:1;34897:9;34893:17;34886:47;34950:131;35076:4;34950:131;:::i;:::-;34942:139;;34669:419;;;:::o;35094:::-;35260:4;35298:2;35287:9;35283:18;35275:26;;35347:9;35341:4;35337:20;35333:1;35322:9;35318:17;35311:47;35375:131;35501:4;35375:131;:::i;:::-;35367:139;;35094:419;;;:::o;35519:::-;35685:4;35723:2;35712:9;35708:18;35700:26;;35772:9;35766:4;35762:20;35758:1;35747:9;35743:17;35736:47;35800:131;35926:4;35800:131;:::i;:::-;35792:139;;35519:419;;;:::o;35944:::-;36110:4;36148:2;36137:9;36133:18;36125:26;;36197:9;36191:4;36187:20;36183:1;36172:9;36168:17;36161:47;36225:131;36351:4;36225:131;:::i;:::-;36217:139;;35944:419;;;:::o;36369:::-;36535:4;36573:2;36562:9;36558:18;36550:26;;36622:9;36616:4;36612:20;36608:1;36597:9;36593:17;36586:47;36650:131;36776:4;36650:131;:::i;:::-;36642:139;;36369:419;;;:::o;36794:::-;36960:4;36998:2;36987:9;36983:18;36975:26;;37047:9;37041:4;37037:20;37033:1;37022:9;37018:17;37011:47;37075:131;37201:4;37075:131;:::i;:::-;37067:139;;36794:419;;;:::o;37219:::-;37385:4;37423:2;37412:9;37408:18;37400:26;;37472:9;37466:4;37462:20;37458:1;37447:9;37443:17;37436:47;37500:131;37626:4;37500:131;:::i;:::-;37492:139;;37219:419;;;:::o;37644:::-;37810:4;37848:2;37837:9;37833:18;37825:26;;37897:9;37891:4;37887:20;37883:1;37872:9;37868:17;37861:47;37925:131;38051:4;37925:131;:::i;:::-;37917:139;;37644:419;;;:::o;38069:::-;38235:4;38273:2;38262:9;38258:18;38250:26;;38322:9;38316:4;38312:20;38308:1;38297:9;38293:17;38286:47;38350:131;38476:4;38350:131;:::i;:::-;38342:139;;38069:419;;;:::o;38494:::-;38660:4;38698:2;38687:9;38683:18;38675:26;;38747:9;38741:4;38737:20;38733:1;38722:9;38718:17;38711:47;38775:131;38901:4;38775:131;:::i;:::-;38767:139;;38494:419;;;:::o;38919:::-;39085:4;39123:2;39112:9;39108:18;39100:26;;39172:9;39166:4;39162:20;39158:1;39147:9;39143:17;39136:47;39200:131;39326:4;39200:131;:::i;:::-;39192:139;;38919:419;;;:::o;39344:::-;39510:4;39548:2;39537:9;39533:18;39525:26;;39597:9;39591:4;39587:20;39583:1;39572:9;39568:17;39561:47;39625:131;39751:4;39625:131;:::i;:::-;39617:139;;39344:419;;;:::o;39769:::-;39935:4;39973:2;39962:9;39958:18;39950:26;;40022:9;40016:4;40012:20;40008:1;39997:9;39993:17;39986:47;40050:131;40176:4;40050:131;:::i;:::-;40042:139;;39769:419;;;:::o;40194:::-;40360:4;40398:2;40387:9;40383:18;40375:26;;40447:9;40441:4;40437:20;40433:1;40422:9;40418:17;40411:47;40475:131;40601:4;40475:131;:::i;:::-;40467:139;;40194:419;;;:::o;40619:222::-;40712:4;40750:2;40739:9;40735:18;40727:26;;40763:71;40831:1;40820:9;40816:17;40807:6;40763:71;:::i;:::-;40619:222;;;;:::o;40847:129::-;40881:6;40908:20;;:::i;:::-;40898:30;;40937:33;40965:4;40957:6;40937:33;:::i;:::-;40847:129;;;:::o;40982:75::-;41015:6;41048:2;41042:9;41032:19;;40982:75;:::o;41063:311::-;41140:4;41230:18;41222:6;41219:30;41216:56;;;41252:18;;:::i;:::-;41216:56;41302:4;41294:6;41290:17;41282:25;;41362:4;41356;41352:15;41344:23;;41063:311;;;:::o;41380:::-;41457:4;41547:18;41539:6;41536:30;41533:56;;;41569:18;;:::i;:::-;41533:56;41619:4;41611:6;41607:17;41599:25;;41679:4;41673;41669:15;41661:23;;41380:311;;;:::o;41697:307::-;41758:4;41848:18;41840:6;41837:30;41834:56;;;41870:18;;:::i;:::-;41834:56;41908:29;41930:6;41908:29;:::i;:::-;41900:37;;41992:4;41986;41982:15;41974:23;;41697:307;;;:::o;42010:308::-;42072:4;42162:18;42154:6;42151:30;42148:56;;;42184:18;;:::i;:::-;42148:56;42222:29;42244:6;42222:29;:::i;:::-;42214:37;;42306:4;42300;42296:15;42288:23;;42010:308;;;:::o;42324:141::-;42373:4;42396:3;42388:11;;42419:3;42416:1;42409:14;42453:4;42450:1;42440:18;42432:26;;42324:141;;;:::o;42471:98::-;42522:6;42556:5;42550:12;42540:22;;42471:98;;;:::o;42575:99::-;42627:6;42661:5;42655:12;42645:22;;42575:99;;;:::o;42680:168::-;42763:11;42797:6;42792:3;42785:19;42837:4;42832:3;42828:14;42813:29;;42680:168;;;;:::o;42854:169::-;42938:11;42972:6;42967:3;42960:19;43012:4;43007:3;43003:14;42988:29;;42854:169;;;;:::o;43029:148::-;43131:11;43168:3;43153:18;;43029:148;;;;:::o;43183:305::-;43223:3;43242:20;43260:1;43242:20;:::i;:::-;43237:25;;43276:20;43294:1;43276:20;:::i;:::-;43271:25;;43430:1;43362:66;43358:74;43355:1;43352:81;43349:107;;;43436:18;;:::i;:::-;43349:107;43480:1;43477;43473:9;43466:16;;43183:305;;;;:::o;43494:185::-;43534:1;43551:20;43569:1;43551:20;:::i;:::-;43546:25;;43585:20;43603:1;43585:20;:::i;:::-;43580:25;;43624:1;43614:35;;43629:18;;:::i;:::-;43614:35;43671:1;43668;43664:9;43659:14;;43494:185;;;;:::o;43685:348::-;43725:7;43748:20;43766:1;43748:20;:::i;:::-;43743:25;;43782:20;43800:1;43782:20;:::i;:::-;43777:25;;43970:1;43902:66;43898:74;43895:1;43892:81;43887:1;43880:9;43873:17;43869:105;43866:131;;;43977:18;;:::i;:::-;43866:131;44025:1;44022;44018:9;44007:20;;43685:348;;;;:::o;44039:191::-;44079:4;44099:20;44117:1;44099:20;:::i;:::-;44094:25;;44133:20;44151:1;44133:20;:::i;:::-;44128:25;;44172:1;44169;44166:8;44163:34;;;44177:18;;:::i;:::-;44163:34;44222:1;44219;44215:9;44207:17;;44039:191;;;;:::o;44236:96::-;44273:7;44302:24;44320:5;44302:24;:::i;:::-;44291:35;;44236:96;;;:::o;44338:90::-;44372:7;44415:5;44408:13;44401:21;44390:32;;44338:90;;;:::o;44434:77::-;44471:7;44500:5;44489:16;;44434:77;;;:::o;44517:149::-;44553:7;44593:66;44586:5;44582:78;44571:89;;44517:149;;;:::o;44672:126::-;44709:7;44749:42;44742:5;44738:54;44727:65;;44672:126;;;:::o;44804:77::-;44841:7;44870:5;44859:16;;44804:77;;;:::o;44887:141::-;44952:9;44985:37;45016:5;44985:37;:::i;:::-;44972:50;;44887:141;;;:::o;45034:149::-;45107:9;45140:37;45171:5;45140:37;:::i;:::-;45127:50;;45034:149;;;:::o;45189:126::-;45239:9;45272:37;45303:5;45272:37;:::i;:::-;45259:50;;45189:126;;;:::o;45321:113::-;45371:9;45404:24;45422:5;45404:24;:::i;:::-;45391:37;;45321:113;;;:::o;45440:154::-;45524:6;45519:3;45514;45501:30;45586:1;45577:6;45572:3;45568:16;45561:27;45440:154;;;:::o;45600:307::-;45668:1;45678:113;45692:6;45689:1;45686:13;45678:113;;;45777:1;45772:3;45768:11;45762:18;45758:1;45753:3;45749:11;45742:39;45714:2;45711:1;45707:10;45702:15;;45678:113;;;45809:6;45806:1;45803:13;45800:101;;;45889:1;45880:6;45875:3;45871:16;45864:27;45800:101;45649:258;45600:307;;;:::o;45913:171::-;45952:3;45975:24;45993:5;45975:24;:::i;:::-;45966:33;;46021:4;46014:5;46011:15;46008:41;;;46029:18;;:::i;:::-;46008:41;46076:1;46069:5;46065:13;46058:20;;45913:171;;;:::o;46090:320::-;46134:6;46171:1;46165:4;46161:12;46151:22;;46218:1;46212:4;46208:12;46239:18;46229:81;;46295:4;46287:6;46283:17;46273:27;;46229:81;46357:2;46349:6;46346:14;46326:18;46323:38;46320:84;;;46376:18;;:::i;:::-;46320:84;46141:269;46090:320;;;:::o;46416:281::-;46499:27;46521:4;46499:27;:::i;:::-;46491:6;46487:40;46629:6;46617:10;46614:22;46593:18;46581:10;46578:34;46575:62;46572:88;;;46640:18;;:::i;:::-;46572:88;46680:10;46676:2;46669:22;46459:238;46416:281;;:::o;46703:233::-;46742:3;46765:24;46783:5;46765:24;:::i;:::-;46756:33;;46811:66;46804:5;46801:77;46798:103;;;46881:18;;:::i;:::-;46798:103;46928:1;46921:5;46917:13;46910:20;;46703:233;;;:::o;46942:176::-;46974:1;46991:20;47009:1;46991:20;:::i;:::-;46986:25;;47025:20;47043:1;47025:20;:::i;:::-;47020:25;;47064:1;47054:35;;47069:18;;:::i;:::-;47054:35;47110:1;47107;47103:9;47098:14;;46942:176;;;;:::o;47124:180::-;47172:77;47169:1;47162:88;47269:4;47266:1;47259:15;47293:4;47290:1;47283:15;47310:180;47358:77;47355:1;47348:88;47455:4;47452:1;47445:15;47479:4;47476:1;47469:15;47496:180;47544:77;47541:1;47534:88;47641:4;47638:1;47631:15;47665:4;47662:1;47655:15;47682:180;47730:77;47727:1;47720:88;47827:4;47824:1;47817:15;47851:4;47848:1;47841:15;47868:180;47916:77;47913:1;47906:88;48013:4;48010:1;48003:15;48037:4;48034:1;48027:15;48054:180;48102:77;48099:1;48092:88;48199:4;48196:1;48189:15;48223:4;48220:1;48213:15;48240:117;48349:1;48346;48339:12;48363:117;48472:1;48469;48462:12;48486:117;48595:1;48592;48585:12;48609:117;48718:1;48715;48708:12;48732:117;48841:1;48838;48831:12;48855:102;48896:6;48947:2;48943:7;48938:2;48931:5;48927:14;48923:28;48913:38;;48855:102;;;:::o;48963:182::-;49103:34;49099:1;49091:6;49087:14;49080:58;48963:182;:::o;49151:181::-;49291:33;49287:1;49279:6;49275:14;49268:57;49151:181;:::o;49338:230::-;49478:34;49474:1;49466:6;49462:14;49455:58;49547:13;49542:2;49534:6;49530:15;49523:38;49338:230;:::o;49574:237::-;49714:34;49710:1;49702:6;49698:14;49691:58;49783:20;49778:2;49770:6;49766:15;49759:45;49574:237;:::o;49817:222::-;49957:34;49953:1;49945:6;49941:14;49934:58;50026:5;50021:2;50013:6;50009:15;50002:30;49817:222;:::o;50045:178::-;50185:30;50181:1;50173:6;50169:14;50162:54;50045:178;:::o;50229:223::-;50369:34;50365:1;50357:6;50353:14;50346:58;50438:6;50433:2;50425:6;50421:15;50414:31;50229:223;:::o;50458:175::-;50598:27;50594:1;50586:6;50582:14;50575:51;50458:175;:::o;50639:231::-;50779:34;50775:1;50767:6;50763:14;50756:58;50848:14;50843:2;50835:6;50831:15;50824:39;50639:231;:::o;50876:243::-;51016:34;51012:1;51004:6;51000:14;50993:58;51085:26;51080:2;51072:6;51068:15;51061:51;50876:243;:::o;51125:229::-;51265:34;51261:1;51253:6;51249:14;51242:58;51334:12;51329:2;51321:6;51317:15;51310:37;51125:229;:::o;51360:228::-;51500:34;51496:1;51488:6;51484:14;51477:58;51569:11;51564:2;51556:6;51552:15;51545:36;51360:228;:::o;51594:224::-;51734:34;51730:1;51722:6;51718:14;51711:58;51803:7;51798:2;51790:6;51786:15;51779:32;51594:224;:::o;51824:225::-;51964:34;51960:1;51952:6;51948:14;51941:58;52033:8;52028:2;52020:6;52016:15;52009:33;51824:225;:::o;52055:182::-;52195:34;52191:1;52183:6;52179:14;52172:58;52055:182;:::o;52243:231::-;52383:34;52379:1;52371:6;52367:14;52360:58;52452:14;52447:2;52439:6;52435:15;52428:39;52243:231;:::o;52480:229::-;52620:34;52616:1;52608:6;52604:14;52597:58;52689:12;52684:2;52676:6;52672:15;52665:37;52480:229;:::o;52715:228::-;52855:34;52851:1;52843:6;52839:14;52832:58;52924:11;52919:2;52911:6;52907:15;52900:36;52715:228;:::o;52949:220::-;53089:34;53085:1;53077:6;53073:14;53066:58;53158:3;53153:2;53145:6;53141:15;53134:28;52949:220;:::o;53175:236::-;53315:34;53311:1;53303:6;53299:14;53292:58;53384:19;53379:2;53371:6;53367:15;53360:44;53175:236;:::o;53417:170::-;53557:22;53553:1;53545:6;53541:14;53534:46;53417:170;:::o;53593:231::-;53733:34;53729:1;53721:6;53717:14;53710:58;53802:14;53797:2;53789:6;53785:15;53778:39;53593:231;:::o;53830:173::-;53970:25;53966:1;53958:6;53954:14;53947:49;53830:173;:::o;54009:224::-;54149:34;54145:1;54137:6;54133:14;54126:58;54218:7;54213:2;54205:6;54201:15;54194:32;54009:224;:::o;54239:167::-;54379:19;54375:1;54367:6;54363:14;54356:43;54239:167;:::o;54412:234::-;54552:34;54548:1;54540:6;54536:14;54529:58;54621:17;54616:2;54608:6;54604:15;54597:42;54412:234;:::o;54652:220::-;54792:34;54788:1;54780:6;54776:14;54769:58;54861:3;54856:2;54848:6;54844:15;54837:28;54652:220;:::o;54878:122::-;54951:24;54969:5;54951:24;:::i;:::-;54944:5;54941:35;54931:63;;54990:1;54987;54980:12;54931:63;54878:122;:::o;55006:116::-;55076:21;55091:5;55076:21;:::i;:::-;55069:5;55066:32;55056:60;;55112:1;55109;55102:12;55056:60;55006:116;:::o;55128:122::-;55201:24;55219:5;55201:24;:::i;:::-;55194:5;55191:35;55181:63;;55240:1;55237;55230:12;55181:63;55128:122;:::o;55256:120::-;55328:23;55345:5;55328:23;:::i;:::-;55321:5;55318:34;55308:62;;55366:1;55363;55356:12;55308:62;55256:120;:::o;55382:122::-;55455:24;55473:5;55455:24;:::i;:::-;55448:5;55445:35;55435:63;;55494:1;55491;55484:12;55435:63;55382:122;:::o
Metadata Hash
ipfs://e14b45bf92b6520d2ff5ee45f848073bcc2270ee7762d32359fc181123bd67e1