ERC-721
Overview
Max Total Supply
999 SPF
Holders
683
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
5 SPFLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
SpatialFrequency
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-01-28 */ // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Strings.sol // 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/Context.sol // 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/access/Ownable.sol // 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/utils/Address.sol // 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/token/ERC721/IERC721Receiver.sol // 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/utils/introspection/IERC165.sol // 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/utils/introspection/ERC165.sol // 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/IERC721.sol // 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/extensions/IERC721Enumerable.sol // 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/IERC721Metadata.sol // 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: contracts/ERC721A.sol pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..). * * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128. * * Does not support burning tokens to address(0). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; struct TokenOwnership { address addr; uint64 startTimestamp; } struct AddressData { uint128 balance; uint128 numberMinted; } uint256 private currentIndex = 0; uint256 internal immutable collectionSize; uint256 internal immutable maxBatchSize; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) private _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // 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 * `maxBatchSize` refers to how much a minter can mint at a time. * `collectionSize_` refers to how many tokens are in the collection. */ constructor( string memory name_, string memory symbol_, uint256 maxBatchSize_, uint256 collectionSize_ ) { require( collectionSize_ > 0, "ERC721A: collection must have a nonzero supply" ); require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero"); _name = name_; _symbol = symbol_; maxBatchSize = maxBatchSize_; collectionSize = collectionSize_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { return currentIndex; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { require(index < totalSupply(), "ERC721A: global index out of bounds"); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { require(index < balanceOf(owner), "ERC721A: owner index out of bounds"); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx = 0; address currOwnershipAddr = address(0); for (uint256 i = 0; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } revert("ERC721A: unable to get token of owner by index"); } /** * @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 || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require(owner != address(0), "ERC721A: balance query for the zero address"); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { require( owner != address(0), "ERC721A: number minted query for the zero address" ); return uint256(_addressData[owner].numberMinted); } function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { require(_exists(tokenId), "ERC721A: owner query for nonexistent token"); uint256 lowestTokenToCheck; if (tokenId >= maxBatchSize) { lowestTokenToCheck = tokenId - maxBatchSize + 1; } for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) { TokenOwnership memory ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } revert("ERC721A: unable to determine the owner of token"); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @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+1).toString(), ".json")) : ""; } /** * @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 override { address owner = ERC721A.ownerOf(tokenId); require(to != owner, "ERC721A: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721A: approve caller is not owner nor approved for all" ); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), "ERC721A: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { require(operator != _msgSender(), "ERC721A: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721A: 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`), */ function _exists(uint256 tokenId) internal view returns (bool) { return tokenId < currentIndex; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ""); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - there must be `quantity` tokens remaining unminted in the total collection. * - `to` cannot be the zero address. * - `quantity` cannot be larger than the max batch size. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = currentIndex; require(to != address(0), "ERC721A: mint to the zero address"); // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering. require(!_exists(startTokenId), "ERC721A: token already minted"); require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high"); _beforeTokenTransfers(address(0), to, startTokenId, quantity); AddressData memory addressData = _addressData[to]; _addressData[to] = AddressData( addressData.balance + uint128(quantity), addressData.numberMinted + uint128(quantity) ); _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp)); uint256 updatedIndex = startTokenId; for (uint256 i = 0; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); require( _checkOnERC721Received(address(0), to, updatedIndex, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); updatedIndex++; } currentIndex = updatedIndex; _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require( isApprovedOrOwner, "ERC721A: transfer caller is not owner nor approved" ); require( prevOwnership.addr == from, "ERC721A: transfer from incorrect owner" ); require(to != address(0), "ERC721A: transfer to the zero address"); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp)); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId] = TokenOwnership( prevOwnership.addr, prevOwnership.startTimestamp ); } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } uint256 public nextOwnerToExplicitlySet = 0; /** * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf(). */ function _setOwnersExplicit(uint256 quantity) internal { uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet; require(quantity > 0, "quantity must be nonzero"); uint256 endIndex = oldNextOwnerToSet + quantity - 1; if (endIndex > collectionSize - 1) { endIndex = collectionSize - 1; } // We know if the last one in the group exists, all in the group exist, due to serial ordering. require(_exists(endIndex), "not enough minted yet for this cleanup"); for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) { if (_ownerships[i].addr == address(0)) { TokenOwnership memory ownership = ownershipOf(i); _ownerships[i] = TokenOwnership( ownership.addr, ownership.startTimestamp ); } } nextOwnerToExplicitlySet = endIndex + 1; } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721A: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * 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`. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // File: contracts/SpatialFrequency.sol pragma solidity ^0.8.2; /* ░██████╗██████╗░███████╗ ██╔════╝██╔══██╗██╔════╝ ╚█████╗░██████╔╝█████╗░░ ░╚═══██╗██╔═══╝░██╔══╝░░ ██████╔╝██║░░░░░██║░░░░░ ╚═════╝░╚═╝░░░░░╚═╝░░░░░ Malus Creations All Rights Reserved 2022 Developed by ATOMICON.PRO ([email protected]) - BEST SMART CONTRACTS in THE WORLD */ contract SpatialFrequency is ERC721A, Ownable, ReentrancyGuard { modifier callerIsUser() { require(tx.origin == msg.sender, "The caller is another contract"); _; } uint256 constant public TOKEN_PRICE = 0.09 ether; uint8 constant public MAX_TOKENS_WHITELIST_SALE = 3; uint8 constant public MAX_TOKENS_PUBLIC_SALE = 2; uint32 public whitelistSaleStartTime = 1643392800; uint32 public publicSaleStartTime = 1643400000; address private _payoutAddress = 0xAb8da4a15424E0A51B31317f3A69f76f1c4033c1; mapping (address => bool) private _whitelist; mapping (address => uint128) private _numberMintedDuringWhitelistSale; constructor() ERC721A("Spatial Frequency", "SPF", MAX_TOKENS_WHITELIST_SALE, 999) {} function saleMint(uint256 quantity) external payable callerIsUser { require(quantity > 0, "Can't mint less then 1 token"); require(totalSupply() + quantity <= collectionSize, "Reached max supply"); require(msg.value == (TOKEN_PRICE * quantity), "Invalid amount of ETH sent"); if(isPublicSaleOn()){ require(quantity <= numberAbleToMint(msg.sender), "Exceeding minting limit for this account"); } else if(isWhitelistSaleOn()){ require(isWhitelistAddress(msg.sender), "Account is not in the whitelist"); require(quantity <= numberAbleToMint(msg.sender), "Exceeding minting limit for this account during whitelist sales"); } else{ require(false, "Sales have not begun yet"); } _safeMint(msg.sender, quantity); if(!isPublicSaleOn()) { _numberMintedDuringWhitelistSale[msg.sender]++; } } function addToWhitelist(address[] memory addresses) external onlyOwner { require(addresses.length <= 250, "Exceeding limit of 250 addresses per operation"); for(uint index = 0; index < addresses.length; index++){ _whitelist[addresses[index]] = true; } } function isWhitelistAddress(address owner) public view returns(bool) { return _whitelist[owner]; } function withdrawMoney() external onlyOwner nonReentrant { payable(_payoutAddress).transfer(address(this).balance); } string private _baseTokenURI; function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function setBaseURI(string calldata baseURI) external onlyOwner { _baseTokenURI = baseURI; } function numberAbleToMint(address owner) public view returns (uint256) { if(isPublicSaleOn()){ return MAX_TOKENS_PUBLIC_SALE + numberMintedDuringWhitelistSale(owner) - numberMinted(owner); } else if(isWhitelistSaleOn()){ return MAX_TOKENS_WHITELIST_SALE - numberMinted(owner); } else { return 0; } } function numberMinted(address owner) public view returns (uint256) { return _numberMinted(owner); } function numberMintedDuringWhitelistSale(address owner) public view returns(uint256){ return _numberMintedDuringWhitelistSale[owner]; } function setPublicSaleStartTime(uint32 unixTime) public onlyOwner { publicSaleStartTime = unixTime; } function isPublicSaleOn() public view returns (bool) { return block.timestamp >= publicSaleStartTime; } function setWhitelistSaleStartTime(uint32 unixTime) public onlyOwner { whitelistSaleStartTime = unixTime; } function isWhitelistSaleOn() public view returns (bool) { return block.timestamp >= whitelistSaleStartTime; } function getOwnershipData(uint256 tokenId) external view returns (TokenOwnership memory) { return ownershipOf(tokenId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_TOKENS_PUBLIC_SALE","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKENS_WHITELIST_SALE","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"isWhitelistAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWhitelistSaleOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberAbleToMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMintedDuringWhitelistSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleStartTime","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"saleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"unixTime","type":"uint32"}],"name":"setPublicSaleStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"unixTime","type":"uint32"}],"name":"setWhitelistSaleStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistSaleStartTime","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c06040526000805560006007556361f42f20600a60006101000a81548163ffffffff021916908363ffffffff1602179055506361f44b40600a60046101000a81548163ffffffff021916908363ffffffff16021790555073ab8da4a15424e0a51b31317f3a69f76f1c4033c1600a60086101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000b957600080fd5b506040518060400160405280601181526020017f5370617469616c204672657175656e63790000000000000000000000000000008152506040518060400160405280600381526020017f5350460000000000000000000000000000000000000000000000000000000000815250600360ff166103e76000811162000174576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200016b9062000433565b60405180910390fd5b60008211620001ba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001b190620004cb565b60405180910390fd5b8360019080519060200190620001d2929190620002fc565b508260029080519060200190620001eb929190620002fc565b508160a0818152505080608081815250505050505062000220620002146200022e60201b60201c565b6200023660201b60201c565b600160098190555062000552565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200030a906200051c565b90600052602060002090601f0160209004810192826200032e57600085556200037a565b82601f106200034957805160ff19168380011785556200037a565b828001600101855582156200037a579182015b82811115620003795782518255916020019190600101906200035c565b5b5090506200038991906200038d565b5090565b5b80821115620003a85760008160009055506001016200038e565b5090565b600082825260208201905092915050565b7f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008201527f6e6f6e7a65726f20737570706c79000000000000000000000000000000000000602082015250565b60006200041b602e83620003ac565b91506200042882620003bd565b604082019050919050565b600060208201905081810360008301526200044e816200040c565b9050919050565b7f455243373231413a206d61782062617463682073697a65206d7573742062652060008201527f6e6f6e7a65726f00000000000000000000000000000000000000000000000000602082015250565b6000620004b3602783620003ac565b9150620004c08262000455565b604082019050919050565b60006020820190508181036000830152620004e681620004a4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200053557607f821691505b602082108114156200054c576200054b620004ed565b5b50919050565b60805160a0516151b562000586600039600081816126a9015281816126d20152612e6d0152600061155c01526151b56000f3fe6080604052600436106102255760003560e01c80637de8690911610123578063ac5227cf116100ab578063d7aed2451161006f578063d7aed24514610820578063dc33e6811461085d578063e985e9c51461089a578063f2fde38b146108d7578063fd0daa571461090057610225565b8063ac5227cf14610739578063b88d4fde14610764578063c87b56dd1461078d578063d2d8cb67146107ca578063d7224ba0146107f557610225565b80639231ab2a116100f25780639231ab2a1461065457806395d89b41146106915780639737e730146106bc578063a22cb465146106f9578063ac4460021461072257610225565b80637de86909146105bb5780637f649783146105e45780638ca887ca1461060d5780638da5cb5b1461062957610225565b80633f5e4741116101b15780635fd84c28116101755780635fd84c28146104d65780636352211e146104ff5780636bb7b1d91461053c57806370a0823114610567578063715018a6146105a457610225565b80633f5e4741146103f157806342842e0e1461041c5780634f6ccce71461044557806355f804b3146104825780635f31c7fb146104ab57610225565b806317bb0556116101f857806317bb0556146102f857806318160ddd14610335578063230b43f41461036057806323b872dd1461038b5780632f745c59146103b457610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c91906133e7565b61092b565b60405161025e919061342f565b60405180910390f35b34801561027357600080fd5b5061027c610a75565b60405161028991906134e3565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b4919061353b565b610b07565b6040516102c691906135a9565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f191906135f0565b610b8c565b005b34801561030457600080fd5b5061031f600480360381019061031a9190613630565b610ca5565b60405161032c919061366c565b60405180910390f35b34801561034157600080fd5b5061034a610d1c565b604051610357919061366c565b60405180910390f35b34801561036c57600080fd5b50610375610d25565b60405161038291906136a6565b60405180910390f35b34801561039757600080fd5b506103b260048036038101906103ad91906136c1565b610d3b565b005b3480156103c057600080fd5b506103db60048036038101906103d691906135f0565b610d4b565b6040516103e8919061366c565b60405180910390f35b3480156103fd57600080fd5b50610406610f49565b604051610413919061342f565b60405180910390f35b34801561042857600080fd5b50610443600480360381019061043e91906136c1565b610f6c565b005b34801561045157600080fd5b5061046c6004803603810190610467919061353b565b610f8c565b604051610479919061366c565b60405180910390f35b34801561048e57600080fd5b506104a960048036038101906104a49190613779565b610fdf565b005b3480156104b757600080fd5b506104c0611071565b6040516104cd91906137e2565b60405180910390f35b3480156104e257600080fd5b506104fd60048036038101906104f89190613829565b611076565b005b34801561050b57600080fd5b506105266004803603810190610521919061353b565b611116565b60405161053391906135a9565b60405180910390f35b34801561054857600080fd5b5061055161112c565b60405161055e91906136a6565b60405180910390f35b34801561057357600080fd5b5061058e60048036038101906105899190613630565b611142565b60405161059b919061366c565b60405180910390f35b3480156105b057600080fd5b506105b961122b565b005b3480156105c757600080fd5b506105e260048036038101906105dd9190613829565b6112b3565b005b3480156105f057600080fd5b5061060b60048036038101906106069190613994565b611353565b005b6106276004803603810190610622919061353b565b6114a9565b005b34801561063557600080fd5b5061063e611825565b60405161064b91906135a9565b60405180910390f35b34801561066057600080fd5b5061067b6004803603810190610676919061353b565b61184f565b6040516106889190613a3e565b60405180910390f35b34801561069d57600080fd5b506106a6611867565b6040516106b391906134e3565b60405180910390f35b3480156106c857600080fd5b506106e360048036038101906106de9190613630565b6118f9565b6040516106f0919061366c565b60405180910390f35b34801561070557600080fd5b50610720600480360381019061071b9190613a85565b611970565b005b34801561072e57600080fd5b50610737611af1565b005b34801561074557600080fd5b5061074e611c2e565b60405161075b919061342f565b60405180910390f35b34801561077057600080fd5b5061078b60048036038101906107869190613b7a565b611c51565b005b34801561079957600080fd5b506107b460048036038101906107af919061353b565b611cad565b6040516107c191906134e3565b60405180910390f35b3480156107d657600080fd5b506107df611d60565b6040516107ec919061366c565b60405180910390f35b34801561080157600080fd5b5061080a611d6c565b604051610817919061366c565b60405180910390f35b34801561082c57600080fd5b5061084760048036038101906108429190613630565b611d72565b604051610854919061342f565b60405180910390f35b34801561086957600080fd5b50610884600480360381019061087f9190613630565b611dc8565b604051610891919061366c565b60405180910390f35b3480156108a657600080fd5b506108c160048036038101906108bc9190613bfd565b611dda565b6040516108ce919061342f565b60405180910390f35b3480156108e357600080fd5b506108fe60048036038101906108f99190613630565b611e6e565b005b34801561090c57600080fd5b50610915611f66565b60405161092291906137e2565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109f657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a5e57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a6e5750610a6d82611f6b565b5b9050919050565b606060018054610a8490613c6c565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab090613c6c565b8015610afd5780601f10610ad257610100808354040283529160200191610afd565b820191906000526020600020905b815481529060010190602001808311610ae057829003601f168201915b5050505050905090565b6000610b1282611fd5565b610b51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4890613d10565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b9782611116565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bff90613da2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c27611fe2565b73ffffffffffffffffffffffffffffffffffffffff161480610c565750610c5581610c50611fe2565b611dda565b5b610c95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8c90613e34565b60405180910390fd5b610ca0838383611fea565b505050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b60008054905090565b600a60009054906101000a900463ffffffff1681565b610d4683838361209c565b505050565b6000610d5683611142565b8210610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e90613ec6565b60405180910390fd5b6000610da1610d1c565b905060008060005b83811015610f07576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610e9b57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ef35786841415610ee4578195505050505050610f43565b8380610eef90613f15565b9450505b508080610eff90613f15565b915050610da9565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3a90613fd0565b60405180910390fd5b92915050565b6000600a60049054906101000a900463ffffffff1663ffffffff16421015905090565b610f8783838360405180602001604052806000815250611c51565b505050565b6000610f96610d1c565b8210610fd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fce90614062565b60405180910390fd5b819050919050565b610fe7611fe2565b73ffffffffffffffffffffffffffffffffffffffff16611005611825565b73ffffffffffffffffffffffffffffffffffffffff161461105b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611052906140ce565b60405180910390fd5b8181600d919061106c92919061329e565b505050565b600381565b61107e611fe2565b73ffffffffffffffffffffffffffffffffffffffff1661109c611825565b73ffffffffffffffffffffffffffffffffffffffff16146110f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e9906140ce565b60405180910390fd5b80600a60046101000a81548163ffffffff021916908363ffffffff16021790555050565b600061112182612655565b600001519050919050565b600a60049054906101000a900463ffffffff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111aa90614160565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611233611fe2565b73ffffffffffffffffffffffffffffffffffffffff16611251611825565b73ffffffffffffffffffffffffffffffffffffffff16146112a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129e906140ce565b60405180910390fd5b6112b16000612858565b565b6112bb611fe2565b73ffffffffffffffffffffffffffffffffffffffff166112d9611825565b73ffffffffffffffffffffffffffffffffffffffff161461132f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611326906140ce565b60405180910390fd5b80600a60006101000a81548163ffffffff021916908363ffffffff16021790555050565b61135b611fe2565b73ffffffffffffffffffffffffffffffffffffffff16611379611825565b73ffffffffffffffffffffffffffffffffffffffff16146113cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c6906140ce565b60405180910390fd5b60fa81511115611414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140b906141f2565b60405180910390fd5b60005b81518110156114a5576001600b600084848151811061143957611438614212565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061149d90613f15565b915050611417565b5050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611517576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150e9061428d565b60405180910390fd5b6000811161155a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611551906142f9565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081611584610d1c565b61158e9190614319565b11156115cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c6906143bb565b60405180910390fd5b8067013fbe85edc900006115e391906143db565b3414611624576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161b90614481565b60405180910390fd5b61162c610f49565b156116815761163a336118f9565b81111561167c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167390614513565b60405180910390fd5b611769565b611689611c2e565b156117265761169733611d72565b6116d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cd9061457f565b60405180910390fd5b6116df336118f9565b811115611721576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171890614611565b60405180910390fd5b611768565b6000611767576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175e9061467d565b60405180910390fd5b5b5b611773338261291e565b61177b610f49565b61182257600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081819054906101000a90046fffffffffffffffffffffffffffffffff16809291906117ea906146b9565b91906101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550505b50565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611857613324565b61186082612655565b9050919050565b60606002805461187690613c6c565b80601f01602080910402602001604051908101604052809291908181526020018280546118a290613c6c565b80156118ef5780601f106118c4576101008083540402835291602001916118ef565b820191906000526020600020905b8154815290600101906020018083116118d257829003601f168201915b5050505050905090565b6000611903610f49565b1561193a5761191182611dc8565b61191a83610ca5565b600260ff166119299190614319565b61193391906146f2565b905061196b565b611942611c2e565b156119665761195082611dc8565b600360ff1661195f91906146f2565b905061196b565b600090505b919050565b611978611fe2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119dd90614772565b60405180910390fd5b80600660006119f3611fe2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611aa0611fe2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ae5919061342f565b60405180910390a35050565b611af9611fe2565b73ffffffffffffffffffffffffffffffffffffffff16611b17611825565b73ffffffffffffffffffffffffffffffffffffffff1614611b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b64906140ce565b60405180910390fd5b60026009541415611bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611baa906147de565b60405180910390fd5b6002600981905550600a60089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611c23573d6000803e3d6000fd5b506001600981905550565b6000600a60009054906101000a900463ffffffff1663ffffffff16421015905090565b611c5c84848461209c565b611c688484848461293c565b611ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9e90614870565b60405180910390fd5b50505050565b6060611cb882611fd5565b611cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cee90614902565b60405180910390fd5b6000611d01612ac4565b90506000815111611d215760405180602001604052806000815250611d58565b80611d37600185611d329190614319565b612b56565b604051602001611d489291906149aa565b6040516020818303038152906040525b915050919050565b67013fbe85edc9000081565b60075481565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000611dd382612cb7565b9050919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611e76611fe2565b73ffffffffffffffffffffffffffffffffffffffff16611e94611825565b73ffffffffffffffffffffffffffffffffffffffff1614611eea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee1906140ce565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5190614a4b565b60405180910390fd5b611f6381612858565b50565b600281565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006120a782612655565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166120ce611fe2565b73ffffffffffffffffffffffffffffffffffffffff16148061212a57506120f3611fe2565b73ffffffffffffffffffffffffffffffffffffffff1661211284610b07565b73ffffffffffffffffffffffffffffffffffffffff16145b8061214657506121458260000151612140611fe2565b611dda565b5b905080612188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217f90614add565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146121fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f190614b6f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561226a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226190614c01565b60405180910390fd5b6122778585856001612da0565b6122876000848460000151611fea565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166122f59190614c21565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166123999190614c55565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600060018461249f9190614319565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156125e55761251581611fd5565b156125e4576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461264d8686866001612da6565b505050505050565b61265d613324565b61266682611fd5565b6126a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269c90614d0d565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000083106127095760017f0000000000000000000000000000000000000000000000000000000000000000846126fc91906146f2565b6127069190614319565b90505b60008390505b818110612817576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461280357809350505050612853565b50808061280f90614d2d565b91505061270f565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284a90614dc9565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612938828260405180602001604052806000815250612dac565b5050565b600061295d8473ffffffffffffffffffffffffffffffffffffffff1661328b565b15612ab7578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612986611fe2565b8786866040518563ffffffff1660e01b81526004016129a89493929190614e3e565b6020604051808303816000875af19250505080156129e457506040513d601f19601f820116820180604052508101906129e19190614e9f565b60015b612a67573d8060008114612a14576040519150601f19603f3d011682016040523d82523d6000602084013e612a19565b606091505b50600081511415612a5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5690614870565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612abc565b600190505b949350505050565b6060600d8054612ad390613c6c565b80601f0160208091040260200160405190810160405280929190818152602001828054612aff90613c6c565b8015612b4c5780601f10612b2157610100808354040283529160200191612b4c565b820191906000526020600020905b815481529060010190602001808311612b2f57829003601f168201915b5050505050905090565b60606000821415612b9e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612cb2565b600082905060005b60008214612bd0578080612bb990613f15565b915050600a82612bc99190614efb565b9150612ba6565b60008167ffffffffffffffff811115612bec57612beb613856565b5b6040519080825280601f01601f191660200182016040528015612c1e5781602001600182028036833780820191505090505b5090505b60008514612cab57600182612c3791906146f2565b9150600a85612c469190614f2c565b6030612c529190614319565b60f81b818381518110612c6857612c67614212565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ca49190614efb565b9450612c22565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1f90614fcf565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612e22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1990615061565b60405180910390fd5b612e2b81611fd5565b15612e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e62906150cd565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000831115612ece576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec59061515f565b60405180910390fd5b612edb6000858386612da0565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151612fd89190614c55565b6fffffffffffffffffffffffffffffffff168152602001858360200151612fff9190614c55565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561326e57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461320e600088848861293c565b61324d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161324490614870565b60405180910390fd5b818061325890613f15565b925050808061326690613f15565b91505061319d565b50806000819055506132836000878588612da6565b505050505050565b600080823b905060008111915050919050565b8280546132aa90613c6c565b90600052602060002090601f0160209004810192826132cc5760008555613313565b82601f106132e557803560ff1916838001178555613313565b82800160010185558215613313579182015b828111156133125782358255916020019190600101906132f7565b5b509050613320919061335e565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b8082111561337757600081600090555060010161335f565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6133c48161338f565b81146133cf57600080fd5b50565b6000813590506133e1816133bb565b92915050565b6000602082840312156133fd576133fc613385565b5b600061340b848285016133d2565b91505092915050565b60008115159050919050565b61342981613414565b82525050565b60006020820190506134446000830184613420565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613484578082015181840152602081019050613469565b83811115613493576000848401525b50505050565b6000601f19601f8301169050919050565b60006134b58261344a565b6134bf8185613455565b93506134cf818560208601613466565b6134d881613499565b840191505092915050565b600060208201905081810360008301526134fd81846134aa565b905092915050565b6000819050919050565b61351881613505565b811461352357600080fd5b50565b6000813590506135358161350f565b92915050565b60006020828403121561355157613550613385565b5b600061355f84828501613526565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061359382613568565b9050919050565b6135a381613588565b82525050565b60006020820190506135be600083018461359a565b92915050565b6135cd81613588565b81146135d857600080fd5b50565b6000813590506135ea816135c4565b92915050565b6000806040838503121561360757613606613385565b5b6000613615858286016135db565b925050602061362685828601613526565b9150509250929050565b60006020828403121561364657613645613385565b5b6000613654848285016135db565b91505092915050565b61366681613505565b82525050565b6000602082019050613681600083018461365d565b92915050565b600063ffffffff82169050919050565b6136a081613687565b82525050565b60006020820190506136bb6000830184613697565b92915050565b6000806000606084860312156136da576136d9613385565b5b60006136e8868287016135db565b93505060206136f9868287016135db565b925050604061370a86828701613526565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f84011261373957613738613714565b5b8235905067ffffffffffffffff81111561375657613755613719565b5b6020830191508360018202830111156137725761377161371e565b5b9250929050565b600080602083850312156137905761378f613385565b5b600083013567ffffffffffffffff8111156137ae576137ad61338a565b5b6137ba85828601613723565b92509250509250929050565b600060ff82169050919050565b6137dc816137c6565b82525050565b60006020820190506137f760008301846137d3565b92915050565b61380681613687565b811461381157600080fd5b50565b600081359050613823816137fd565b92915050565b60006020828403121561383f5761383e613385565b5b600061384d84828501613814565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61388e82613499565b810181811067ffffffffffffffff821117156138ad576138ac613856565b5b80604052505050565b60006138c061337b565b90506138cc8282613885565b919050565b600067ffffffffffffffff8211156138ec576138eb613856565b5b602082029050602081019050919050565b600061391061390b846138d1565b6138b6565b905080838252602082019050602084028301858111156139335761393261371e565b5b835b8181101561395c578061394888826135db565b845260208401935050602081019050613935565b5050509392505050565b600082601f83011261397b5761397a613714565b5b813561398b8482602086016138fd565b91505092915050565b6000602082840312156139aa576139a9613385565b5b600082013567ffffffffffffffff8111156139c8576139c761338a565b5b6139d484828501613966565b91505092915050565b6139e681613588565b82525050565b600067ffffffffffffffff82169050919050565b613a09816139ec565b82525050565b604082016000820151613a2560008501826139dd565b506020820151613a386020850182613a00565b50505050565b6000604082019050613a536000830184613a0f565b92915050565b613a6281613414565b8114613a6d57600080fd5b50565b600081359050613a7f81613a59565b92915050565b60008060408385031215613a9c57613a9b613385565b5b6000613aaa858286016135db565b9250506020613abb85828601613a70565b9150509250929050565b600080fd5b600067ffffffffffffffff821115613ae557613ae4613856565b5b613aee82613499565b9050602081019050919050565b82818337600083830152505050565b6000613b1d613b1884613aca565b6138b6565b905082815260208101848484011115613b3957613b38613ac5565b5b613b44848285613afb565b509392505050565b600082601f830112613b6157613b60613714565b5b8135613b71848260208601613b0a565b91505092915050565b60008060008060808587031215613b9457613b93613385565b5b6000613ba2878288016135db565b9450506020613bb3878288016135db565b9350506040613bc487828801613526565b925050606085013567ffffffffffffffff811115613be557613be461338a565b5b613bf187828801613b4c565b91505092959194509250565b60008060408385031215613c1457613c13613385565b5b6000613c22858286016135db565b9250506020613c33858286016135db565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613c8457607f821691505b60208210811415613c9857613c97613c3d565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b6000613cfa602d83613455565b9150613d0582613c9e565b604082019050919050565b60006020820190508181036000830152613d2981613ced565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d8c602283613455565b9150613d9782613d30565b604082019050919050565b60006020820190508181036000830152613dbb81613d7f565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b6000613e1e603983613455565b9150613e2982613dc2565b604082019050919050565b60006020820190508181036000830152613e4d81613e11565b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b6000613eb0602283613455565b9150613ebb82613e54565b604082019050919050565b60006020820190508181036000830152613edf81613ea3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613f2082613505565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f5357613f52613ee6565b5b600182019050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b6000613fba602e83613455565b9150613fc582613f5e565b604082019050919050565b60006020820190508181036000830152613fe981613fad565b9050919050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b600061404c602383613455565b915061405782613ff0565b604082019050919050565b6000602082019050818103600083015261407b8161403f565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006140b8602083613455565b91506140c382614082565b602082019050919050565b600060208201905081810360008301526140e7816140ab565b9050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b600061414a602b83613455565b9150614155826140ee565b604082019050919050565b600060208201905081810360008301526141798161413d565b9050919050565b7f457863656564696e67206c696d6974206f66203235302061646472657373657360008201527f20706572206f7065726174696f6e000000000000000000000000000000000000602082015250565b60006141dc602e83613455565b91506141e782614180565b604082019050919050565b6000602082019050818103600083015261420b816141cf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b6000614277601e83613455565b915061428282614241565b602082019050919050565b600060208201905081810360008301526142a68161426a565b9050919050565b7f43616e2774206d696e74206c657373207468656e203120746f6b656e00000000600082015250565b60006142e3601c83613455565b91506142ee826142ad565b602082019050919050565b60006020820190508181036000830152614312816142d6565b9050919050565b600061432482613505565b915061432f83613505565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561436457614363613ee6565b5b828201905092915050565b7f52656163686564206d617820737570706c790000000000000000000000000000600082015250565b60006143a5601283613455565b91506143b08261436f565b602082019050919050565b600060208201905081810360008301526143d481614398565b9050919050565b60006143e682613505565b91506143f183613505565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561442a57614429613ee6565b5b828202905092915050565b7f496e76616c696420616d6f756e74206f66204554482073656e74000000000000600082015250565b600061446b601a83613455565b915061447682614435565b602082019050919050565b6000602082019050818103600083015261449a8161445e565b9050919050565b7f457863656564696e67206d696e74696e67206c696d697420666f72207468697360008201527f206163636f756e74000000000000000000000000000000000000000000000000602082015250565b60006144fd602883613455565b9150614508826144a1565b604082019050919050565b6000602082019050818103600083015261452c816144f0565b9050919050565b7f4163636f756e74206973206e6f7420696e207468652077686974656c69737400600082015250565b6000614569601f83613455565b915061457482614533565b602082019050919050565b600060208201905081810360008301526145988161455c565b9050919050565b7f457863656564696e67206d696e74696e67206c696d697420666f72207468697360008201527f206163636f756e7420647572696e672077686974656c6973742073616c657300602082015250565b60006145fb603f83613455565b91506146068261459f565b604082019050919050565b6000602082019050818103600083015261462a816145ee565b9050919050565b7f53616c65732068617665206e6f7420626567756e207965740000000000000000600082015250565b6000614667601883613455565b915061467282614631565b602082019050919050565b600060208201905081810360008301526146968161465a565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b60006146c48261469d565b91506fffffffffffffffffffffffffffffffff8214156146e7576146e6613ee6565b5b600182019050919050565b60006146fd82613505565b915061470883613505565b92508282101561471b5761471a613ee6565b5b828203905092915050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b600061475c601a83613455565b915061476782614726565b602082019050919050565b6000602082019050818103600083015261478b8161474f565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006147c8601f83613455565b91506147d382614792565b602082019050919050565b600060208201905081810360008301526147f7816147bb565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b600061485a603383613455565b9150614865826147fe565b604082019050919050565b600060208201905081810360008301526148898161484d565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006148ec602f83613455565b91506148f782614890565b604082019050919050565b6000602082019050818103600083015261491b816148df565b9050919050565b600081905092915050565b60006149388261344a565b6149428185614922565b9350614952818560208601613466565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614994600583614922565b915061499f8261495e565b600582019050919050565b60006149b6828561492d565b91506149c2828461492d565b91506149cd82614987565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614a35602683613455565b9150614a40826149d9565b604082019050919050565b60006020820190508181036000830152614a6481614a28565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000614ac7603283613455565b9150614ad282614a6b565b604082019050919050565b60006020820190508181036000830152614af681614aba565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b6000614b59602683613455565b9150614b6482614afd565b604082019050919050565b60006020820190508181036000830152614b8881614b4c565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614beb602583613455565b9150614bf682614b8f565b604082019050919050565b60006020820190508181036000830152614c1a81614bde565b9050919050565b6000614c2c8261469d565b9150614c378361469d565b925082821015614c4a57614c49613ee6565b5b828203905092915050565b6000614c608261469d565b9150614c6b8361469d565b9250826fffffffffffffffffffffffffffffffff03821115614c9057614c8f613ee6565b5b828201905092915050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b6000614cf7602a83613455565b9150614d0282614c9b565b604082019050919050565b60006020820190508181036000830152614d2681614cea565b9050919050565b6000614d3882613505565b91506000821415614d4c57614d4b613ee6565b5b600182039050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b6000614db3602f83613455565b9150614dbe82614d57565b604082019050919050565b60006020820190508181036000830152614de281614da6565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614e1082614de9565b614e1a8185614df4565b9350614e2a818560208601613466565b614e3381613499565b840191505092915050565b6000608082019050614e53600083018761359a565b614e60602083018661359a565b614e6d604083018561365d565b8181036060830152614e7f8184614e05565b905095945050505050565b600081519050614e99816133bb565b92915050565b600060208284031215614eb557614eb4613385565b5b6000614ec384828501614e8a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614f0682613505565b9150614f1183613505565b925082614f2157614f20614ecc565b5b828204905092915050565b6000614f3782613505565b9150614f4283613505565b925082614f5257614f51614ecc565b5b828206905092915050565b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b6000614fb9603183613455565b9150614fc482614f5d565b604082019050919050565b60006020820190508181036000830152614fe881614fac565b9050919050565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061504b602183613455565b915061505682614fef565b604082019050919050565b6000602082019050818103600083015261507a8161503e565b9050919050565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b60006150b7601d83613455565b91506150c282615081565b602082019050919050565b600060208201905081810360008301526150e6816150aa565b9050919050565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b6000615149602283613455565b9150615154826150ed565b604082019050919050565b600060208201905081810360008301526151788161513c565b905091905056fea264697066735822122038856c28fbe6e2b326dae57a1e3f9cfb87e3535e810a64747ac8afb1db08550c64736f6c634300080b0033
Deployed Bytecode
0x6080604052600436106102255760003560e01c80637de8690911610123578063ac5227cf116100ab578063d7aed2451161006f578063d7aed24514610820578063dc33e6811461085d578063e985e9c51461089a578063f2fde38b146108d7578063fd0daa571461090057610225565b8063ac5227cf14610739578063b88d4fde14610764578063c87b56dd1461078d578063d2d8cb67146107ca578063d7224ba0146107f557610225565b80639231ab2a116100f25780639231ab2a1461065457806395d89b41146106915780639737e730146106bc578063a22cb465146106f9578063ac4460021461072257610225565b80637de86909146105bb5780637f649783146105e45780638ca887ca1461060d5780638da5cb5b1461062957610225565b80633f5e4741116101b15780635fd84c28116101755780635fd84c28146104d65780636352211e146104ff5780636bb7b1d91461053c57806370a0823114610567578063715018a6146105a457610225565b80633f5e4741146103f157806342842e0e1461041c5780634f6ccce71461044557806355f804b3146104825780635f31c7fb146104ab57610225565b806317bb0556116101f857806317bb0556146102f857806318160ddd14610335578063230b43f41461036057806323b872dd1461038b5780632f745c59146103b457610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063095ea7b3146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c91906133e7565b61092b565b60405161025e919061342f565b60405180910390f35b34801561027357600080fd5b5061027c610a75565b60405161028991906134e3565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b4919061353b565b610b07565b6040516102c691906135a9565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f191906135f0565b610b8c565b005b34801561030457600080fd5b5061031f600480360381019061031a9190613630565b610ca5565b60405161032c919061366c565b60405180910390f35b34801561034157600080fd5b5061034a610d1c565b604051610357919061366c565b60405180910390f35b34801561036c57600080fd5b50610375610d25565b60405161038291906136a6565b60405180910390f35b34801561039757600080fd5b506103b260048036038101906103ad91906136c1565b610d3b565b005b3480156103c057600080fd5b506103db60048036038101906103d691906135f0565b610d4b565b6040516103e8919061366c565b60405180910390f35b3480156103fd57600080fd5b50610406610f49565b604051610413919061342f565b60405180910390f35b34801561042857600080fd5b50610443600480360381019061043e91906136c1565b610f6c565b005b34801561045157600080fd5b5061046c6004803603810190610467919061353b565b610f8c565b604051610479919061366c565b60405180910390f35b34801561048e57600080fd5b506104a960048036038101906104a49190613779565b610fdf565b005b3480156104b757600080fd5b506104c0611071565b6040516104cd91906137e2565b60405180910390f35b3480156104e257600080fd5b506104fd60048036038101906104f89190613829565b611076565b005b34801561050b57600080fd5b506105266004803603810190610521919061353b565b611116565b60405161053391906135a9565b60405180910390f35b34801561054857600080fd5b5061055161112c565b60405161055e91906136a6565b60405180910390f35b34801561057357600080fd5b5061058e60048036038101906105899190613630565b611142565b60405161059b919061366c565b60405180910390f35b3480156105b057600080fd5b506105b961122b565b005b3480156105c757600080fd5b506105e260048036038101906105dd9190613829565b6112b3565b005b3480156105f057600080fd5b5061060b60048036038101906106069190613994565b611353565b005b6106276004803603810190610622919061353b565b6114a9565b005b34801561063557600080fd5b5061063e611825565b60405161064b91906135a9565b60405180910390f35b34801561066057600080fd5b5061067b6004803603810190610676919061353b565b61184f565b6040516106889190613a3e565b60405180910390f35b34801561069d57600080fd5b506106a6611867565b6040516106b391906134e3565b60405180910390f35b3480156106c857600080fd5b506106e360048036038101906106de9190613630565b6118f9565b6040516106f0919061366c565b60405180910390f35b34801561070557600080fd5b50610720600480360381019061071b9190613a85565b611970565b005b34801561072e57600080fd5b50610737611af1565b005b34801561074557600080fd5b5061074e611c2e565b60405161075b919061342f565b60405180910390f35b34801561077057600080fd5b5061078b60048036038101906107869190613b7a565b611c51565b005b34801561079957600080fd5b506107b460048036038101906107af919061353b565b611cad565b6040516107c191906134e3565b60405180910390f35b3480156107d657600080fd5b506107df611d60565b6040516107ec919061366c565b60405180910390f35b34801561080157600080fd5b5061080a611d6c565b604051610817919061366c565b60405180910390f35b34801561082c57600080fd5b5061084760048036038101906108429190613630565b611d72565b604051610854919061342f565b60405180910390f35b34801561086957600080fd5b50610884600480360381019061087f9190613630565b611dc8565b604051610891919061366c565b60405180910390f35b3480156108a657600080fd5b506108c160048036038101906108bc9190613bfd565b611dda565b6040516108ce919061342f565b60405180910390f35b3480156108e357600080fd5b506108fe60048036038101906108f99190613630565b611e6e565b005b34801561090c57600080fd5b50610915611f66565b60405161092291906137e2565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109f657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a5e57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a6e5750610a6d82611f6b565b5b9050919050565b606060018054610a8490613c6c565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab090613c6c565b8015610afd5780601f10610ad257610100808354040283529160200191610afd565b820191906000526020600020905b815481529060010190602001808311610ae057829003601f168201915b5050505050905090565b6000610b1282611fd5565b610b51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4890613d10565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b9782611116565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bff90613da2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c27611fe2565b73ffffffffffffffffffffffffffffffffffffffff161480610c565750610c5581610c50611fe2565b611dda565b5b610c95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8c90613e34565b60405180910390fd5b610ca0838383611fea565b505050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b60008054905090565b600a60009054906101000a900463ffffffff1681565b610d4683838361209c565b505050565b6000610d5683611142565b8210610d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8e90613ec6565b60405180910390fd5b6000610da1610d1c565b905060008060005b83811015610f07576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610e9b57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ef35786841415610ee4578195505050505050610f43565b8380610eef90613f15565b9450505b508080610eff90613f15565b915050610da9565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3a90613fd0565b60405180910390fd5b92915050565b6000600a60049054906101000a900463ffffffff1663ffffffff16421015905090565b610f8783838360405180602001604052806000815250611c51565b505050565b6000610f96610d1c565b8210610fd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fce90614062565b60405180910390fd5b819050919050565b610fe7611fe2565b73ffffffffffffffffffffffffffffffffffffffff16611005611825565b73ffffffffffffffffffffffffffffffffffffffff161461105b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611052906140ce565b60405180910390fd5b8181600d919061106c92919061329e565b505050565b600381565b61107e611fe2565b73ffffffffffffffffffffffffffffffffffffffff1661109c611825565b73ffffffffffffffffffffffffffffffffffffffff16146110f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e9906140ce565b60405180910390fd5b80600a60046101000a81548163ffffffff021916908363ffffffff16021790555050565b600061112182612655565b600001519050919050565b600a60049054906101000a900463ffffffff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111aa90614160565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611233611fe2565b73ffffffffffffffffffffffffffffffffffffffff16611251611825565b73ffffffffffffffffffffffffffffffffffffffff16146112a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129e906140ce565b60405180910390fd5b6112b16000612858565b565b6112bb611fe2565b73ffffffffffffffffffffffffffffffffffffffff166112d9611825565b73ffffffffffffffffffffffffffffffffffffffff161461132f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611326906140ce565b60405180910390fd5b80600a60006101000a81548163ffffffff021916908363ffffffff16021790555050565b61135b611fe2565b73ffffffffffffffffffffffffffffffffffffffff16611379611825565b73ffffffffffffffffffffffffffffffffffffffff16146113cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c6906140ce565b60405180910390fd5b60fa81511115611414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140b906141f2565b60405180910390fd5b60005b81518110156114a5576001600b600084848151811061143957611438614212565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061149d90613f15565b915050611417565b5050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611517576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150e9061428d565b60405180910390fd5b6000811161155a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611551906142f9565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000003e781611584610d1c565b61158e9190614319565b11156115cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c6906143bb565b60405180910390fd5b8067013fbe85edc900006115e391906143db565b3414611624576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161b90614481565b60405180910390fd5b61162c610f49565b156116815761163a336118f9565b81111561167c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167390614513565b60405180910390fd5b611769565b611689611c2e565b156117265761169733611d72565b6116d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cd9061457f565b60405180910390fd5b6116df336118f9565b811115611721576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171890614611565b60405180910390fd5b611768565b6000611767576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175e9061467d565b60405180910390fd5b5b5b611773338261291e565b61177b610f49565b61182257600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081819054906101000a90046fffffffffffffffffffffffffffffffff16809291906117ea906146b9565b91906101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550505b50565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611857613324565b61186082612655565b9050919050565b60606002805461187690613c6c565b80601f01602080910402602001604051908101604052809291908181526020018280546118a290613c6c565b80156118ef5780601f106118c4576101008083540402835291602001916118ef565b820191906000526020600020905b8154815290600101906020018083116118d257829003601f168201915b5050505050905090565b6000611903610f49565b1561193a5761191182611dc8565b61191a83610ca5565b600260ff166119299190614319565b61193391906146f2565b905061196b565b611942611c2e565b156119665761195082611dc8565b600360ff1661195f91906146f2565b905061196b565b600090505b919050565b611978611fe2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119dd90614772565b60405180910390fd5b80600660006119f3611fe2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611aa0611fe2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ae5919061342f565b60405180910390a35050565b611af9611fe2565b73ffffffffffffffffffffffffffffffffffffffff16611b17611825565b73ffffffffffffffffffffffffffffffffffffffff1614611b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b64906140ce565b60405180910390fd5b60026009541415611bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611baa906147de565b60405180910390fd5b6002600981905550600a60089054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611c23573d6000803e3d6000fd5b506001600981905550565b6000600a60009054906101000a900463ffffffff1663ffffffff16421015905090565b611c5c84848461209c565b611c688484848461293c565b611ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9e90614870565b60405180910390fd5b50505050565b6060611cb882611fd5565b611cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cee90614902565b60405180910390fd5b6000611d01612ac4565b90506000815111611d215760405180602001604052806000815250611d58565b80611d37600185611d329190614319565b612b56565b604051602001611d489291906149aa565b6040516020818303038152906040525b915050919050565b67013fbe85edc9000081565b60075481565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000611dd382612cb7565b9050919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611e76611fe2565b73ffffffffffffffffffffffffffffffffffffffff16611e94611825565b73ffffffffffffffffffffffffffffffffffffffff1614611eea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee1906140ce565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5190614a4b565b60405180910390fd5b611f6381612858565b50565b600281565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006120a782612655565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166120ce611fe2565b73ffffffffffffffffffffffffffffffffffffffff16148061212a57506120f3611fe2565b73ffffffffffffffffffffffffffffffffffffffff1661211284610b07565b73ffffffffffffffffffffffffffffffffffffffff16145b8061214657506121458260000151612140611fe2565b611dda565b5b905080612188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217f90614add565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146121fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f190614b6f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561226a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226190614c01565b60405180910390fd5b6122778585856001612da0565b6122876000848460000151611fea565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166122f59190614c21565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166123999190614c55565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600060018461249f9190614319565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156125e55761251581611fd5565b156125e4576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461264d8686866001612da6565b505050505050565b61265d613324565b61266682611fd5565b6126a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269c90614d0d565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000383106127095760017f0000000000000000000000000000000000000000000000000000000000000003846126fc91906146f2565b6127069190614319565b90505b60008390505b818110612817576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461280357809350505050612853565b50808061280f90614d2d565b91505061270f565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284a90614dc9565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612938828260405180602001604052806000815250612dac565b5050565b600061295d8473ffffffffffffffffffffffffffffffffffffffff1661328b565b15612ab7578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612986611fe2565b8786866040518563ffffffff1660e01b81526004016129a89493929190614e3e565b6020604051808303816000875af19250505080156129e457506040513d601f19601f820116820180604052508101906129e19190614e9f565b60015b612a67573d8060008114612a14576040519150601f19603f3d011682016040523d82523d6000602084013e612a19565b606091505b50600081511415612a5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5690614870565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612abc565b600190505b949350505050565b6060600d8054612ad390613c6c565b80601f0160208091040260200160405190810160405280929190818152602001828054612aff90613c6c565b8015612b4c5780601f10612b2157610100808354040283529160200191612b4c565b820191906000526020600020905b815481529060010190602001808311612b2f57829003601f168201915b5050505050905090565b60606000821415612b9e576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612cb2565b600082905060005b60008214612bd0578080612bb990613f15565b915050600a82612bc99190614efb565b9150612ba6565b60008167ffffffffffffffff811115612bec57612beb613856565b5b6040519080825280601f01601f191660200182016040528015612c1e5781602001600182028036833780820191505090505b5090505b60008514612cab57600182612c3791906146f2565b9150600a85612c469190614f2c565b6030612c529190614319565b60f81b818381518110612c6857612c67614212565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ca49190614efb565b9450612c22565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1f90614fcf565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612e22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e1990615061565b60405180910390fd5b612e2b81611fd5565b15612e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e62906150cd565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000003831115612ece576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec59061515f565b60405180910390fd5b612edb6000858386612da0565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151612fd89190614c55565b6fffffffffffffffffffffffffffffffff168152602001858360200151612fff9190614c55565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561326e57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461320e600088848861293c565b61324d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161324490614870565b60405180910390fd5b818061325890613f15565b925050808061326690613f15565b91505061319d565b50806000819055506132836000878588612da6565b505050505050565b600080823b905060008111915050919050565b8280546132aa90613c6c565b90600052602060002090601f0160209004810192826132cc5760008555613313565b82601f106132e557803560ff1916838001178555613313565b82800160010185558215613313579182015b828111156133125782358255916020019190600101906132f7565b5b509050613320919061335e565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b8082111561337757600081600090555060010161335f565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6133c48161338f565b81146133cf57600080fd5b50565b6000813590506133e1816133bb565b92915050565b6000602082840312156133fd576133fc613385565b5b600061340b848285016133d2565b91505092915050565b60008115159050919050565b61342981613414565b82525050565b60006020820190506134446000830184613420565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613484578082015181840152602081019050613469565b83811115613493576000848401525b50505050565b6000601f19601f8301169050919050565b60006134b58261344a565b6134bf8185613455565b93506134cf818560208601613466565b6134d881613499565b840191505092915050565b600060208201905081810360008301526134fd81846134aa565b905092915050565b6000819050919050565b61351881613505565b811461352357600080fd5b50565b6000813590506135358161350f565b92915050565b60006020828403121561355157613550613385565b5b600061355f84828501613526565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061359382613568565b9050919050565b6135a381613588565b82525050565b60006020820190506135be600083018461359a565b92915050565b6135cd81613588565b81146135d857600080fd5b50565b6000813590506135ea816135c4565b92915050565b6000806040838503121561360757613606613385565b5b6000613615858286016135db565b925050602061362685828601613526565b9150509250929050565b60006020828403121561364657613645613385565b5b6000613654848285016135db565b91505092915050565b61366681613505565b82525050565b6000602082019050613681600083018461365d565b92915050565b600063ffffffff82169050919050565b6136a081613687565b82525050565b60006020820190506136bb6000830184613697565b92915050565b6000806000606084860312156136da576136d9613385565b5b60006136e8868287016135db565b93505060206136f9868287016135db565b925050604061370a86828701613526565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f84011261373957613738613714565b5b8235905067ffffffffffffffff81111561375657613755613719565b5b6020830191508360018202830111156137725761377161371e565b5b9250929050565b600080602083850312156137905761378f613385565b5b600083013567ffffffffffffffff8111156137ae576137ad61338a565b5b6137ba85828601613723565b92509250509250929050565b600060ff82169050919050565b6137dc816137c6565b82525050565b60006020820190506137f760008301846137d3565b92915050565b61380681613687565b811461381157600080fd5b50565b600081359050613823816137fd565b92915050565b60006020828403121561383f5761383e613385565b5b600061384d84828501613814565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61388e82613499565b810181811067ffffffffffffffff821117156138ad576138ac613856565b5b80604052505050565b60006138c061337b565b90506138cc8282613885565b919050565b600067ffffffffffffffff8211156138ec576138eb613856565b5b602082029050602081019050919050565b600061391061390b846138d1565b6138b6565b905080838252602082019050602084028301858111156139335761393261371e565b5b835b8181101561395c578061394888826135db565b845260208401935050602081019050613935565b5050509392505050565b600082601f83011261397b5761397a613714565b5b813561398b8482602086016138fd565b91505092915050565b6000602082840312156139aa576139a9613385565b5b600082013567ffffffffffffffff8111156139c8576139c761338a565b5b6139d484828501613966565b91505092915050565b6139e681613588565b82525050565b600067ffffffffffffffff82169050919050565b613a09816139ec565b82525050565b604082016000820151613a2560008501826139dd565b506020820151613a386020850182613a00565b50505050565b6000604082019050613a536000830184613a0f565b92915050565b613a6281613414565b8114613a6d57600080fd5b50565b600081359050613a7f81613a59565b92915050565b60008060408385031215613a9c57613a9b613385565b5b6000613aaa858286016135db565b9250506020613abb85828601613a70565b9150509250929050565b600080fd5b600067ffffffffffffffff821115613ae557613ae4613856565b5b613aee82613499565b9050602081019050919050565b82818337600083830152505050565b6000613b1d613b1884613aca565b6138b6565b905082815260208101848484011115613b3957613b38613ac5565b5b613b44848285613afb565b509392505050565b600082601f830112613b6157613b60613714565b5b8135613b71848260208601613b0a565b91505092915050565b60008060008060808587031215613b9457613b93613385565b5b6000613ba2878288016135db565b9450506020613bb3878288016135db565b9350506040613bc487828801613526565b925050606085013567ffffffffffffffff811115613be557613be461338a565b5b613bf187828801613b4c565b91505092959194509250565b60008060408385031215613c1457613c13613385565b5b6000613c22858286016135db565b9250506020613c33858286016135db565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613c8457607f821691505b60208210811415613c9857613c97613c3d565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b6000613cfa602d83613455565b9150613d0582613c9e565b604082019050919050565b60006020820190508181036000830152613d2981613ced565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d8c602283613455565b9150613d9782613d30565b604082019050919050565b60006020820190508181036000830152613dbb81613d7f565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b6000613e1e603983613455565b9150613e2982613dc2565b604082019050919050565b60006020820190508181036000830152613e4d81613e11565b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b6000613eb0602283613455565b9150613ebb82613e54565b604082019050919050565b60006020820190508181036000830152613edf81613ea3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613f2082613505565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f5357613f52613ee6565b5b600182019050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b6000613fba602e83613455565b9150613fc582613f5e565b604082019050919050565b60006020820190508181036000830152613fe981613fad565b9050919050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b600061404c602383613455565b915061405782613ff0565b604082019050919050565b6000602082019050818103600083015261407b8161403f565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006140b8602083613455565b91506140c382614082565b602082019050919050565b600060208201905081810360008301526140e7816140ab565b9050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b600061414a602b83613455565b9150614155826140ee565b604082019050919050565b600060208201905081810360008301526141798161413d565b9050919050565b7f457863656564696e67206c696d6974206f66203235302061646472657373657360008201527f20706572206f7065726174696f6e000000000000000000000000000000000000602082015250565b60006141dc602e83613455565b91506141e782614180565b604082019050919050565b6000602082019050818103600083015261420b816141cf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b6000614277601e83613455565b915061428282614241565b602082019050919050565b600060208201905081810360008301526142a68161426a565b9050919050565b7f43616e2774206d696e74206c657373207468656e203120746f6b656e00000000600082015250565b60006142e3601c83613455565b91506142ee826142ad565b602082019050919050565b60006020820190508181036000830152614312816142d6565b9050919050565b600061432482613505565b915061432f83613505565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561436457614363613ee6565b5b828201905092915050565b7f52656163686564206d617820737570706c790000000000000000000000000000600082015250565b60006143a5601283613455565b91506143b08261436f565b602082019050919050565b600060208201905081810360008301526143d481614398565b9050919050565b60006143e682613505565b91506143f183613505565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561442a57614429613ee6565b5b828202905092915050565b7f496e76616c696420616d6f756e74206f66204554482073656e74000000000000600082015250565b600061446b601a83613455565b915061447682614435565b602082019050919050565b6000602082019050818103600083015261449a8161445e565b9050919050565b7f457863656564696e67206d696e74696e67206c696d697420666f72207468697360008201527f206163636f756e74000000000000000000000000000000000000000000000000602082015250565b60006144fd602883613455565b9150614508826144a1565b604082019050919050565b6000602082019050818103600083015261452c816144f0565b9050919050565b7f4163636f756e74206973206e6f7420696e207468652077686974656c69737400600082015250565b6000614569601f83613455565b915061457482614533565b602082019050919050565b600060208201905081810360008301526145988161455c565b9050919050565b7f457863656564696e67206d696e74696e67206c696d697420666f72207468697360008201527f206163636f756e7420647572696e672077686974656c6973742073616c657300602082015250565b60006145fb603f83613455565b91506146068261459f565b604082019050919050565b6000602082019050818103600083015261462a816145ee565b9050919050565b7f53616c65732068617665206e6f7420626567756e207965740000000000000000600082015250565b6000614667601883613455565b915061467282614631565b602082019050919050565b600060208201905081810360008301526146968161465a565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b60006146c48261469d565b91506fffffffffffffffffffffffffffffffff8214156146e7576146e6613ee6565b5b600182019050919050565b60006146fd82613505565b915061470883613505565b92508282101561471b5761471a613ee6565b5b828203905092915050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b600061475c601a83613455565b915061476782614726565b602082019050919050565b6000602082019050818103600083015261478b8161474f565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006147c8601f83613455565b91506147d382614792565b602082019050919050565b600060208201905081810360008301526147f7816147bb565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b600061485a603383613455565b9150614865826147fe565b604082019050919050565b600060208201905081810360008301526148898161484d565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006148ec602f83613455565b91506148f782614890565b604082019050919050565b6000602082019050818103600083015261491b816148df565b9050919050565b600081905092915050565b60006149388261344a565b6149428185614922565b9350614952818560208601613466565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614994600583614922565b915061499f8261495e565b600582019050919050565b60006149b6828561492d565b91506149c2828461492d565b91506149cd82614987565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614a35602683613455565b9150614a40826149d9565b604082019050919050565b60006020820190508181036000830152614a6481614a28565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000614ac7603283613455565b9150614ad282614a6b565b604082019050919050565b60006020820190508181036000830152614af681614aba565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b6000614b59602683613455565b9150614b6482614afd565b604082019050919050565b60006020820190508181036000830152614b8881614b4c565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614beb602583613455565b9150614bf682614b8f565b604082019050919050565b60006020820190508181036000830152614c1a81614bde565b9050919050565b6000614c2c8261469d565b9150614c378361469d565b925082821015614c4a57614c49613ee6565b5b828203905092915050565b6000614c608261469d565b9150614c6b8361469d565b9250826fffffffffffffffffffffffffffffffff03821115614c9057614c8f613ee6565b5b828201905092915050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b6000614cf7602a83613455565b9150614d0282614c9b565b604082019050919050565b60006020820190508181036000830152614d2681614cea565b9050919050565b6000614d3882613505565b91506000821415614d4c57614d4b613ee6565b5b600182039050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b6000614db3602f83613455565b9150614dbe82614d57565b604082019050919050565b60006020820190508181036000830152614de281614da6565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614e1082614de9565b614e1a8185614df4565b9350614e2a818560208601613466565b614e3381613499565b840191505092915050565b6000608082019050614e53600083018761359a565b614e60602083018661359a565b614e6d604083018561365d565b8181036060830152614e7f8184614e05565b905095945050505050565b600081519050614e99816133bb565b92915050565b600060208284031215614eb557614eb4613385565b5b6000614ec384828501614e8a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614f0682613505565b9150614f1183613505565b925082614f2157614f20614ecc565b5b828204905092915050565b6000614f3782613505565b9150614f4283613505565b925082614f5257614f51614ecc565b5b828206905092915050565b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b6000614fb9603183613455565b9150614fc482614f5d565b604082019050919050565b60006020820190508181036000830152614fe881614fac565b9050919050565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061504b602183613455565b915061505682614fef565b604082019050919050565b6000602082019050818103600083015261507a8161503e565b9050919050565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b60006150b7601d83613455565b91506150c282615081565b602082019050919050565b600060208201905081810360008301526150e6816150aa565b9050919050565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b6000615149602283613455565b9150615154826150ed565b604082019050919050565b600060208201905081810360008301526151788161513c565b905091905056fea264697066735822122038856c28fbe6e2b326dae57a1e3f9cfb87e3535e810a64747ac8afb1db08550c64736f6c634300080b0033
Deployed Bytecode Sourcemap
42989:3963:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29953:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31681:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33219:202;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32782:379;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46117:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28502:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43366:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34067:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29133:756;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46397:117;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34272:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28665:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45495:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43251:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46274:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31504:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43422:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30379:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7489:103;;;;;;;;;;;;;:::i;:::-;;46522:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44769:300;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43782:979;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6838:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46782:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31836:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45609:379;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33485:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45197:131;;;;;;;;;;;;;:::i;:::-;;46651:123;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34492:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31997:407;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43190:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38920:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45077:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45996:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33822:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7747:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43309:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29953:370;30080:4;30125:25;30110:40;;;:11;:40;;;;:99;;;;30176:33;30161:48;;;:11;:48;;;;30110:99;:160;;;;30235:35;30220:50;;;:11;:50;;;;30110:160;:207;;;;30281:36;30305:11;30281:23;:36::i;:::-;30110:207;30096:221;;29953:370;;;:::o;31681:94::-;31735:13;31764:5;31757:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31681:94;:::o;33219:202::-;33287:7;33311:16;33319:7;33311;:16::i;:::-;33303:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;33391:15;:24;33407:7;33391:24;;;;;;;;;;;;;;;;;;;;;33384:31;;33219:202;;;:::o;32782:379::-;32851:13;32867:24;32883:7;32867:15;:24::i;:::-;32851:40;;32912:5;32906:11;;:2;:11;;;;32898:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32997:5;32981:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;33006:37;33023:5;33030:12;:10;:12::i;:::-;33006:16;:37::i;:::-;32981:62;32965:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;33127:28;33136:2;33140:7;33149:5;33127:8;:28::i;:::-;32844:317;32782:379;;:::o;46117:149::-;46193:7;46219:32;:39;46252:5;46219:39;;;;;;;;;;;;;;;;;;;;;;;;;46212:46;;;;46117:149;;;:::o;28502:94::-;28555:7;28578:12;;28571:19;;28502:94;:::o;43366:49::-;;;;;;;;;;;;;:::o;34067:142::-;34175:28;34185:4;34191:2;34195:7;34175:9;:28::i;:::-;34067:142;;;:::o;29133:756::-;29242:7;29277:16;29287:5;29277:9;:16::i;:::-;29269:5;:24;29261:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;29341:22;29366:13;:11;:13::i;:::-;29341:38;;29386:19;29416:25;29468:9;29463:356;29487:14;29483:1;:18;29463:356;;;29517:31;29551:11;:14;29563:1;29551:14;;;;;;;;;;;29517:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29606:1;29580:28;;:9;:14;;;:28;;;29576:89;;29641:9;:14;;;29621:34;;29576:89;29700:5;29679:26;;:17;:26;;;29675:137;;;29737:5;29722:11;:20;29718:59;;;29764:1;29757:8;;;;;;;;;29718:59;29789:13;;;;;:::i;:::-;;;;29675:137;29508:311;29503:3;;;;;:::i;:::-;;;;29463:356;;;;29827:56;;;;;;;;;;:::i;:::-;;;;;;;;29133:756;;;;;:::o;46397:117::-;46444:4;46487:19;;;;;;;;;;;46468:38;;:15;:38;;46461:45;;46397:117;:::o;34272:157::-;34384:39;34401:4;34407:2;34411:7;34384:39;;;;;;;;;;;;:16;:39::i;:::-;34272:157;;;:::o;28665:177::-;28732:7;28764:13;:11;:13::i;:::-;28756:5;:21;28748:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;28831:5;28824:12;;28665:177;;;:::o;45495:106::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45586:7:::1;;45570:13;:23;;;;;;;:::i;:::-;;45495:106:::0;;:::o;43251:51::-;43301:1;43251:51;:::o;46274:115::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46373:8:::1;46351:19;;:30;;;;;;;;;;;;;;;;;;46274:115:::0;:::o;31504:118::-;31568:7;31591:20;31603:7;31591:11;:20::i;:::-;:25;;;31584:32;;31504:118;;;:::o;43422:46::-;;;;;;;;;;;;;:::o;30379:211::-;30443:7;30484:1;30467:19;;:5;:19;;;;30459:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;30556:12;:19;30569:5;30556:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;30548:36;;30541:43;;30379:211;;;:::o;7489:103::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7554:30:::1;7581:1;7554:18;:30::i;:::-;7489:103::o:0;46522:121::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46627:8:::1;46602:22;;:33;;;;;;;;;;;;;;;;;;46522:121:::0;:::o;44769:300::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44879:3:::1;44859:9;:16;:23;;44851:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;44950:10;44946:116;44974:9;:16;44966:5;:24;44946:116;;;45046:4;45015:10;:28;45026:9;45036:5;45026:16;;;;;;;;:::i;:::-;;;;;;;;45015:28;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;44992:7;;;;;:::i;:::-;;;;44946:116;;;;44769:300:::0;:::o;43782:979::-;43117:10;43104:23;;:9;:23;;;43096:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;43910:1:::1;43899:8;:12;43891:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;43991:14;43979:8;43963:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:42;;43955:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;44075:8;43228:10;44061:22;;;;:::i;:::-;44047:9;:37;44039:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;44131:16;:14;:16::i;:::-;44128:475;;;44183:28;44200:10;44183:16;:28::i;:::-;44171:8;:40;;44163:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;44128:475;;;44277:19;:17;:19::i;:::-;44274:329;;;44320:30;44339:10;44320:18;:30::i;:::-;44312:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;44421:28;44438:10;44421:16;:28::i;:::-;44409:8;:40;;44401:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;44274:329;;;44557:5;44549:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;44274:329;44128:475;44615:31;44625:10;44637:8;44615:9;:31::i;:::-;44663:16;:14;:16::i;:::-;44659:95;;44696:32;:44;44729:10;44696:44;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;44659:95;43782:979:::0;:::o;6838:87::-;6884:7;6911:6;;;;;;;;;;;6904:13;;6838:87;:::o;46782:167::-;46875:21;;:::i;:::-;46921:20;46933:7;46921:11;:20::i;:::-;46914:27;;46782:167;;;:::o;31836:98::-;31892:13;31921:7;31914:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31836:98;:::o;45609:379::-;45671:7;45694:16;:14;:16::i;:::-;45691:290;;;45799:19;45812:5;45799:12;:19::i;:::-;45758:38;45790:5;45758:31;:38::i;:::-;43356:1;45733:63;;;;;;:::i;:::-;:85;;;;:::i;:::-;45726:92;;;;45691:290;45839:19;:17;:19::i;:::-;45836:145;;;45909:19;45922:5;45909:12;:19::i;:::-;43301:1;45881:47;;;;;;:::i;:::-;45874:54;;;;45836:145;45968:1;45961:8;;45609:379;;;;:::o;33485:274::-;33588:12;:10;:12::i;:::-;33576:24;;:8;:24;;;;33568:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;33685:8;33640:18;:32;33659:12;:10;:12::i;:::-;33640:32;;;;;;;;;;;;;;;:42;33673:8;33640:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;33734:8;33705:48;;33720:12;:10;:12::i;:::-;33705:48;;;33744:8;33705:48;;;;;;:::i;:::-;;;;;;;;33485:274;;:::o;45197:131::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1:::1;2410:7;;:19;;2402:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;45273:14:::2;;;;;;;;;;;45265:32;;:55;45298:21;45265:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;1768:1:::1;2722:7;:22;;;;45197:131::o:0;46651:123::-;46701:4;46744:22;;;;;;;;;;;46725:41;;:15;:41;;46718:48;;46651:123;:::o;34492:311::-;34629:28;34639:4;34645:2;34649:7;34629:9;:28::i;:::-;34680:48;34703:4;34709:2;34713:7;34722:5;34680:22;:48::i;:::-;34664:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;34492:311;;;;:::o;31997:407::-;32095:13;32136:16;32144:7;32136;:16::i;:::-;32120:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;32226:21;32250:10;:8;:10::i;:::-;32226:34;;32305:1;32287:7;32281:21;:25;:117;;;;;;;;;;;;;;;;;32342:7;32351:22;32360:1;32352:7;:9;;;;:::i;:::-;32351:20;:22::i;:::-;32325:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32281:117;32267:131;;;31997:407;;;:::o;43190:48::-;43228:10;43190:48;:::o;38920:43::-;;;;:::o;45077:112::-;45140:4;45164:10;:17;45175:5;45164:17;;;;;;;;;;;;;;;;;;;;;;;;;45157:24;;45077:112;;;:::o;45996:113::-;46054:7;46081:20;46095:5;46081:13;:20::i;:::-;46074:27;;45996:113;;;:::o;33822:186::-;33944:4;33967:18;:25;33986:5;33967:25;;;;;;;;;;;;;;;:35;33993:8;33967:35;;;;;;;;;;;;;;;;;;;;;;;;;33960:42;;33822:186;;;;:::o;7747:201::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7856:1:::1;7836:22;;:8;:22;;;;7828:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7912:28;7931:8;7912:18;:28::i;:::-;7747:201:::0;:::o;43309:48::-;43356:1;43309:48;:::o;19270:157::-;19355:4;19394:25;19379:40;;;:11;:40;;;;19372:47;;19270:157;;;:::o;35042:105::-;35099:4;35129:12;;35119:7;:22;35112:29;;35042:105;;;:::o;5562:98::-;5615:7;5642:10;5635:17;;5562:98;:::o;38742:172::-;38866:2;38839:15;:24;38855:7;38839:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;38900:7;38896:2;38880:28;;38889:5;38880:28;;;;;;;;;;;;38742:172;;;:::o;37107:1529::-;37204:35;37242:20;37254:7;37242:11;:20::i;:::-;37204:58;;37271:22;37313:13;:18;;;37297:34;;:12;:10;:12::i;:::-;:34;;;:81;;;;37366:12;:10;:12::i;:::-;37342:36;;:20;37354:7;37342:11;:20::i;:::-;:36;;;37297:81;:142;;;;37389:50;37406:13;:18;;;37426:12;:10;:12::i;:::-;37389:16;:50::i;:::-;37297:142;37271:169;;37465:17;37449:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;37597:4;37575:26;;:13;:18;;;:26;;;37559:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;37686:1;37672:16;;:2;:16;;;;37664:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;37739:43;37761:4;37767:2;37771:7;37780:1;37739:21;:43::i;:::-;37839:49;37856:1;37860:7;37869:13;:18;;;37839:8;:49::i;:::-;37927:1;37897:12;:18;37910:4;37897:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;37963:1;37935:12;:16;37948:2;37935:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;37994:43;;;;;;;;38009:2;37994:43;;;;;;38020:15;37994:43;;;;;37971:11;:20;37983:7;37971:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38265:19;38297:1;38287:7;:11;;;;:::i;:::-;38265:33;;38350:1;38309:43;;:11;:24;38321:11;38309:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;38305:236;;;38367:20;38375:11;38367:7;:20::i;:::-;38363:171;;;38427:97;;;;;;;;38454:13;:18;;;38427:97;;;;;;38485:13;:28;;;38427:97;;;;;38400:11;:24;38412:11;38400:24;;;;;;;;;;;:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38363:171;38305:236;38573:7;38569:2;38554:27;;38563:4;38554:27;;;;;;;;;;;;38588:42;38609:4;38615:2;38619:7;38628:1;38588:20;:42::i;:::-;37197:1439;;;37107:1529;;;:::o;30842:608::-;30918:21;;:::i;:::-;30959:16;30967:7;30959;:16::i;:::-;30951:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;31031:26;31079:12;31068:7;:23;31064:93;;31148:1;31133:12;31123:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;31102:47;;31064:93;31170:12;31185:7;31170:22;;31165:214;31202:18;31194:4;:26;31165:214;;31239:31;31273:11;:17;31285:4;31273:17;;;;;;;;;;;31239:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31331:1;31305:28;;:9;:14;;;:28;;;31301:71;;31353:9;31346:16;;;;;;;31301:71;31230:149;31222:6;;;;;:::i;:::-;;;;31165:214;;;;31387:57;;;;;;;;;;:::i;:::-;;;;;;;;30842:608;;;;:::o;8108:191::-;8182:16;8201:6;;;;;;;;;;;8182:25;;8227:8;8218:6;;:17;;;;;;;;;;;;;;;;;;8282:8;8251:40;;8272:8;8251:40;;;;;;;;;;;;8171:128;8108:191;:::o;35153:98::-;35218:27;35228:2;35232:8;35218:27;;;;;;;;;;;;:9;:27::i;:::-;35153:98;;:::o;40473:690::-;40610:4;40627:15;:2;:13;;;:15::i;:::-;40623:535;;;40682:2;40666:36;;;40703:12;:10;:12::i;:::-;40717:4;40723:7;40732:5;40666:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40653:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40914:1;40897:6;:13;:18;40893:215;;;40930:61;;;;;;;;;;:::i;:::-;;;;;;;;40893:215;41076:6;41070:13;41061:6;41057:2;41053:15;41046:38;40653:464;40798:45;;;40788:55;;;:6;:55;;;;40781:62;;;;;40623:535;41146:4;41139:11;;40473:690;;;;;;;:::o;45373:114::-;45433:13;45466;45459:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45373:114;:::o;3124:723::-;3180:13;3410:1;3401:5;:10;3397:53;;;3428:10;;;;;;;;;;;;;;;;;;;;;3397:53;3460:12;3475:5;3460:20;;3491:14;3516:78;3531:1;3523:4;:9;3516:78;;3549:8;;;;;:::i;:::-;;;;3580:2;3572:10;;;;;:::i;:::-;;;3516:78;;;3604:19;3636:6;3626:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3604:39;;3654:154;3670:1;3661:5;:10;3654:154;;3698:1;3688:11;;;;;:::i;:::-;;;3765:2;3757:5;:10;;;;:::i;:::-;3744:2;:24;;;;:::i;:::-;3731:39;;3714:6;3721;3714:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3794:2;3785:11;;;;;:::i;:::-;;;3654:154;;;3832:6;3818:21;;;;;3124:723;;;;:::o;30596:240::-;30657:7;30706:1;30689:19;;:5;:19;;;;30673:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;30797:12;:19;30810:5;30797:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;30789:41;;30782:48;;30596:240;;;:::o;41625:141::-;;;;;:::o;42152:140::-;;;;;:::o;35590:1285::-;35695:20;35718:12;;35695:35;;35759:1;35745:16;;:2;:16;;;;35737:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;35942:21;35950:12;35942:7;:21::i;:::-;35941:22;35933:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;36024:12;36012:8;:24;;36004:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;36084:61;36114:1;36118:2;36122:12;36136:8;36084:21;:61::i;:::-;36154:30;36187:12;:16;36200:2;36187:16;;;;;;;;;;;;;;;36154:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36229:119;;;;;;;;36279:8;36249:11;:19;;;:39;;;;:::i;:::-;36229:119;;;;;;36332:8;36297:11;:24;;;:44;;;;:::i;:::-;36229:119;;;;;36210:12;:16;36223:2;36210:16;;;;;;;;;;;;;;;:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36383:43;;;;;;;;36398:2;36383:43;;;;;;36409:15;36383:43;;;;;36355:11;:25;36367:12;36355:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36435:20;36458:12;36435:35;;36484:9;36479:288;36503:8;36499:1;:12;36479:288;;;36557:12;36553:2;36532:38;;36549:1;36532:38;;;;;;;;;;;;36597:59;36628:1;36632:2;36636:12;36650:5;36597:22;:59::i;:::-;36579:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;36745:14;;;;;:::i;:::-;;;;36513:3;;;;;:::i;:::-;;;;36479:288;;;;36790:12;36775;:27;;;;36809:60;36838:1;36842:2;36846:12;36860:8;36809:20;:60::i;:::-;35688:1187;;;35590:1285;;;:::o;9126:387::-;9186:4;9394:12;9461:7;9449:20;9441:28;;9504:1;9497:4;:8;9490:15;;;9126:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:329::-;4997:6;5046:2;5034:9;5025:7;5021:23;5017:32;5014:119;;;5052:79;;:::i;:::-;5014:119;5172:1;5197:53;5242:7;5233:6;5222:9;5218:22;5197:53;:::i;:::-;5187:63;;5143:117;4938:329;;;;:::o;5273:118::-;5360:24;5378:5;5360:24;:::i;:::-;5355:3;5348:37;5273:118;;:::o;5397:222::-;5490:4;5528:2;5517:9;5513:18;5505:26;;5541:71;5609:1;5598:9;5594:17;5585:6;5541:71;:::i;:::-;5397:222;;;;:::o;5625:93::-;5661:7;5701:10;5694:5;5690:22;5679:33;;5625:93;;;:::o;5724:115::-;5809:23;5826:5;5809:23;:::i;:::-;5804:3;5797:36;5724:115;;:::o;5845:218::-;5936:4;5974:2;5963:9;5959:18;5951:26;;5987:69;6053:1;6042:9;6038:17;6029:6;5987:69;:::i;:::-;5845:218;;;;:::o;6069:619::-;6146:6;6154;6162;6211:2;6199:9;6190:7;6186:23;6182:32;6179:119;;;6217:79;;:::i;:::-;6179:119;6337:1;6362:53;6407:7;6398:6;6387:9;6383:22;6362:53;:::i;:::-;6352:63;;6308:117;6464:2;6490:53;6535:7;6526:6;6515:9;6511:22;6490:53;:::i;:::-;6480:63;;6435:118;6592:2;6618:53;6663:7;6654:6;6643:9;6639:22;6618:53;:::i;:::-;6608:63;;6563:118;6069:619;;;;;:::o;6694:117::-;6803:1;6800;6793:12;6817:117;6926:1;6923;6916:12;6940:117;7049:1;7046;7039:12;7077:553;7135:8;7145:6;7195:3;7188:4;7180:6;7176:17;7172:27;7162:122;;7203:79;;:::i;:::-;7162:122;7316:6;7303:20;7293:30;;7346:18;7338:6;7335:30;7332:117;;;7368:79;;:::i;:::-;7332:117;7482:4;7474:6;7470:17;7458:29;;7536:3;7528:4;7520:6;7516:17;7506:8;7502:32;7499:41;7496:128;;;7543:79;;:::i;:::-;7496:128;7077:553;;;;;:::o;7636:529::-;7707:6;7715;7764:2;7752:9;7743:7;7739:23;7735:32;7732:119;;;7770:79;;:::i;:::-;7732:119;7918:1;7907:9;7903:17;7890:31;7948:18;7940:6;7937:30;7934:117;;;7970:79;;:::i;:::-;7934:117;8083:65;8140:7;8131:6;8120:9;8116:22;8083:65;:::i;:::-;8065:83;;;;7861:297;7636:529;;;;;:::o;8171:86::-;8206:7;8246:4;8239:5;8235:16;8224:27;;8171:86;;;:::o;8263:112::-;8346:22;8362:5;8346:22;:::i;:::-;8341:3;8334:35;8263:112;;:::o;8381:214::-;8470:4;8508:2;8497:9;8493:18;8485:26;;8521:67;8585:1;8574:9;8570:17;8561:6;8521:67;:::i;:::-;8381:214;;;;:::o;8601:120::-;8673:23;8690:5;8673:23;:::i;:::-;8666:5;8663:34;8653:62;;8711:1;8708;8701:12;8653:62;8601:120;:::o;8727:137::-;8772:5;8810:6;8797:20;8788:29;;8826:32;8852:5;8826:32;:::i;:::-;8727:137;;;;:::o;8870:327::-;8928:6;8977:2;8965:9;8956:7;8952:23;8948:32;8945:119;;;8983:79;;:::i;:::-;8945:119;9103:1;9128:52;9172:7;9163:6;9152:9;9148:22;9128:52;:::i;:::-;9118:62;;9074:116;8870:327;;;;:::o;9203:180::-;9251:77;9248:1;9241:88;9348:4;9345:1;9338:15;9372:4;9369:1;9362:15;9389:281;9472:27;9494:4;9472:27;:::i;:::-;9464:6;9460:40;9602:6;9590:10;9587:22;9566:18;9554:10;9551:34;9548:62;9545:88;;;9613:18;;:::i;:::-;9545:88;9653:10;9649:2;9642:22;9432:238;9389:281;;:::o;9676:129::-;9710:6;9737:20;;:::i;:::-;9727:30;;9766:33;9794:4;9786:6;9766:33;:::i;:::-;9676:129;;;:::o;9811:311::-;9888:4;9978:18;9970:6;9967:30;9964:56;;;10000:18;;:::i;:::-;9964:56;10050:4;10042:6;10038:17;10030:25;;10110:4;10104;10100:15;10092:23;;9811:311;;;:::o;10145:710::-;10241:5;10266:81;10282:64;10339:6;10282:64;:::i;:::-;10266:81;:::i;:::-;10257:90;;10367:5;10396:6;10389:5;10382:21;10430:4;10423:5;10419:16;10412:23;;10483:4;10475:6;10471:17;10463:6;10459:30;10512:3;10504:6;10501:15;10498:122;;;10531:79;;:::i;:::-;10498:122;10646:6;10629:220;10663:6;10658:3;10655:15;10629:220;;;10738:3;10767:37;10800:3;10788:10;10767:37;:::i;:::-;10762:3;10755:50;10834:4;10829:3;10825:14;10818:21;;10705:144;10689:4;10684:3;10680:14;10673:21;;10629:220;;;10633:21;10247:608;;10145:710;;;;;:::o;10878:370::-;10949:5;10998:3;10991:4;10983:6;10979:17;10975:27;10965:122;;11006:79;;:::i;:::-;10965:122;11123:6;11110:20;11148:94;11238:3;11230:6;11223:4;11215:6;11211:17;11148:94;:::i;:::-;11139:103;;10955:293;10878:370;;;;:::o;11254:539::-;11338:6;11387:2;11375:9;11366:7;11362:23;11358:32;11355:119;;;11393:79;;:::i;:::-;11355:119;11541:1;11530:9;11526:17;11513:31;11571:18;11563:6;11560:30;11557:117;;;11593:79;;:::i;:::-;11557:117;11698:78;11768:7;11759:6;11748:9;11744:22;11698:78;:::i;:::-;11688:88;;11484:302;11254:539;;;;:::o;11799:108::-;11876:24;11894:5;11876:24;:::i;:::-;11871:3;11864:37;11799:108;;:::o;11913:101::-;11949:7;11989:18;11982:5;11978:30;11967:41;;11913:101;;;:::o;12020:105::-;12095:23;12112:5;12095:23;:::i;:::-;12090:3;12083:36;12020:105;;:::o;12201:527::-;12360:4;12355:3;12351:14;12447:4;12440:5;12436:16;12430:23;12466:63;12523:4;12518:3;12514:14;12500:12;12466:63;:::i;:::-;12375:164;12631:4;12624:5;12620:16;12614:23;12650:61;12705:4;12700:3;12696:14;12682:12;12650:61;:::i;:::-;12549:172;12329:399;12201:527;;:::o;12734:346::-;12889:4;12927:2;12916:9;12912:18;12904:26;;12940:133;13070:1;13059:9;13055:17;13046:6;12940:133;:::i;:::-;12734:346;;;;:::o;13086:116::-;13156:21;13171:5;13156:21;:::i;:::-;13149:5;13146:32;13136:60;;13192:1;13189;13182:12;13136:60;13086:116;:::o;13208:133::-;13251:5;13289:6;13276:20;13267:29;;13305:30;13329:5;13305:30;:::i;:::-;13208:133;;;;:::o;13347:468::-;13412:6;13420;13469:2;13457:9;13448:7;13444:23;13440:32;13437:119;;;13475:79;;:::i;:::-;13437:119;13595:1;13620:53;13665:7;13656:6;13645:9;13641:22;13620:53;:::i;:::-;13610:63;;13566:117;13722:2;13748:50;13790:7;13781:6;13770:9;13766:22;13748:50;:::i;:::-;13738:60;;13693:115;13347:468;;;;;:::o;13821:117::-;13930:1;13927;13920:12;13944:307;14005:4;14095:18;14087:6;14084:30;14081:56;;;14117:18;;:::i;:::-;14081:56;14155:29;14177:6;14155:29;:::i;:::-;14147:37;;14239:4;14233;14229:15;14221:23;;13944:307;;;:::o;14257:154::-;14341:6;14336:3;14331;14318:30;14403:1;14394:6;14389:3;14385:16;14378:27;14257:154;;;:::o;14417:410::-;14494:5;14519:65;14535:48;14576:6;14535:48;:::i;:::-;14519:65;:::i;:::-;14510:74;;14607:6;14600:5;14593:21;14645:4;14638:5;14634:16;14683:3;14674:6;14669:3;14665:16;14662:25;14659:112;;;14690:79;;:::i;:::-;14659:112;14780:41;14814:6;14809:3;14804;14780:41;:::i;:::-;14500:327;14417:410;;;;;:::o;14846:338::-;14901:5;14950:3;14943:4;14935:6;14931:17;14927:27;14917:122;;14958:79;;:::i;:::-;14917:122;15075:6;15062:20;15100:78;15174:3;15166:6;15159:4;15151:6;15147:17;15100:78;:::i;:::-;15091:87;;14907:277;14846:338;;;;:::o;15190:943::-;15285:6;15293;15301;15309;15358:3;15346:9;15337:7;15333:23;15329:33;15326:120;;;15365:79;;:::i;:::-;15326:120;15485:1;15510:53;15555:7;15546:6;15535:9;15531:22;15510:53;:::i;:::-;15500:63;;15456:117;15612:2;15638:53;15683:7;15674:6;15663:9;15659:22;15638:53;:::i;:::-;15628:63;;15583:118;15740:2;15766:53;15811:7;15802:6;15791:9;15787:22;15766:53;:::i;:::-;15756:63;;15711:118;15896:2;15885:9;15881:18;15868:32;15927:18;15919:6;15916:30;15913:117;;;15949:79;;:::i;:::-;15913:117;16054:62;16108:7;16099:6;16088:9;16084:22;16054:62;:::i;:::-;16044:72;;15839:287;15190:943;;;;;;;:::o;16139:474::-;16207:6;16215;16264:2;16252:9;16243:7;16239:23;16235:32;16232:119;;;16270:79;;:::i;:::-;16232:119;16390:1;16415:53;16460:7;16451:6;16440:9;16436:22;16415:53;:::i;:::-;16405:63;;16361:117;16517:2;16543:53;16588:7;16579:6;16568:9;16564:22;16543:53;:::i;:::-;16533:63;;16488:118;16139:474;;;;;:::o;16619:180::-;16667:77;16664:1;16657:88;16764:4;16761:1;16754:15;16788:4;16785:1;16778:15;16805:320;16849:6;16886:1;16880:4;16876:12;16866:22;;16933:1;16927:4;16923:12;16954:18;16944:81;;17010:4;17002:6;16998:17;16988:27;;16944:81;17072:2;17064:6;17061:14;17041:18;17038:38;17035:84;;;17091:18;;:::i;:::-;17035:84;16856:269;16805:320;;;:::o;17131:232::-;17271:34;17267:1;17259:6;17255:14;17248:58;17340:15;17335:2;17327:6;17323:15;17316:40;17131:232;:::o;17369:366::-;17511:3;17532:67;17596:2;17591:3;17532:67;:::i;:::-;17525:74;;17608:93;17697:3;17608:93;:::i;:::-;17726:2;17721:3;17717:12;17710:19;;17369:366;;;:::o;17741:419::-;17907:4;17945:2;17934:9;17930:18;17922:26;;17994:9;17988:4;17984:20;17980:1;17969:9;17965:17;17958:47;18022:131;18148:4;18022:131;:::i;:::-;18014:139;;17741:419;;;:::o;18166:221::-;18306:34;18302:1;18294:6;18290:14;18283:58;18375:4;18370:2;18362:6;18358:15;18351:29;18166:221;:::o;18393:366::-;18535:3;18556:67;18620:2;18615:3;18556:67;:::i;:::-;18549:74;;18632:93;18721:3;18632:93;:::i;:::-;18750:2;18745:3;18741:12;18734:19;;18393:366;;;:::o;18765:419::-;18931:4;18969:2;18958:9;18954:18;18946:26;;19018:9;19012:4;19008:20;19004:1;18993:9;18989:17;18982:47;19046:131;19172:4;19046:131;:::i;:::-;19038:139;;18765:419;;;:::o;19190:244::-;19330:34;19326:1;19318:6;19314:14;19307:58;19399:27;19394:2;19386:6;19382:15;19375:52;19190:244;:::o;19440:366::-;19582:3;19603:67;19667:2;19662:3;19603:67;:::i;:::-;19596:74;;19679:93;19768:3;19679:93;:::i;:::-;19797:2;19792:3;19788:12;19781:19;;19440:366;;;:::o;19812:419::-;19978:4;20016:2;20005:9;20001:18;19993:26;;20065:9;20059:4;20055:20;20051:1;20040:9;20036:17;20029:47;20093:131;20219:4;20093:131;:::i;:::-;20085:139;;19812:419;;;:::o;20237:221::-;20377:34;20373:1;20365:6;20361:14;20354:58;20446:4;20441:2;20433:6;20429:15;20422:29;20237:221;:::o;20464:366::-;20606:3;20627:67;20691:2;20686:3;20627:67;:::i;:::-;20620:74;;20703:93;20792:3;20703:93;:::i;:::-;20821:2;20816:3;20812:12;20805:19;;20464:366;;;:::o;20836:419::-;21002:4;21040:2;21029:9;21025:18;21017:26;;21089:9;21083:4;21079:20;21075:1;21064:9;21060:17;21053:47;21117:131;21243:4;21117:131;:::i;:::-;21109:139;;20836:419;;;:::o;21261:180::-;21309:77;21306:1;21299:88;21406:4;21403:1;21396:15;21430:4;21427:1;21420:15;21447:233;21486:3;21509:24;21527:5;21509:24;:::i;:::-;21500:33;;21555:66;21548:5;21545:77;21542:103;;;21625:18;;:::i;:::-;21542:103;21672:1;21665:5;21661:13;21654:20;;21447:233;;;:::o;21686:::-;21826:34;21822:1;21814:6;21810:14;21803:58;21895:16;21890:2;21882:6;21878:15;21871:41;21686:233;:::o;21925:366::-;22067:3;22088:67;22152:2;22147:3;22088:67;:::i;:::-;22081:74;;22164:93;22253:3;22164:93;:::i;:::-;22282:2;22277:3;22273:12;22266:19;;21925:366;;;:::o;22297:419::-;22463:4;22501:2;22490:9;22486:18;22478:26;;22550:9;22544:4;22540:20;22536:1;22525:9;22521:17;22514:47;22578:131;22704:4;22578:131;:::i;:::-;22570:139;;22297:419;;;:::o;22722:222::-;22862:34;22858:1;22850:6;22846:14;22839:58;22931:5;22926:2;22918:6;22914:15;22907:30;22722:222;:::o;22950:366::-;23092:3;23113:67;23177:2;23172:3;23113:67;:::i;:::-;23106:74;;23189:93;23278:3;23189:93;:::i;:::-;23307:2;23302:3;23298:12;23291:19;;22950:366;;;:::o;23322:419::-;23488:4;23526:2;23515:9;23511:18;23503:26;;23575:9;23569:4;23565:20;23561:1;23550:9;23546:17;23539:47;23603:131;23729:4;23603:131;:::i;:::-;23595:139;;23322:419;;;:::o;23747:182::-;23887:34;23883:1;23875:6;23871:14;23864:58;23747:182;:::o;23935:366::-;24077:3;24098:67;24162:2;24157:3;24098:67;:::i;:::-;24091:74;;24174:93;24263:3;24174:93;:::i;:::-;24292:2;24287:3;24283:12;24276:19;;23935:366;;;:::o;24307:419::-;24473:4;24511:2;24500:9;24496:18;24488:26;;24560:9;24554:4;24550:20;24546:1;24535:9;24531:17;24524:47;24588:131;24714:4;24588:131;:::i;:::-;24580:139;;24307:419;;;:::o;24732:230::-;24872:34;24868:1;24860:6;24856:14;24849:58;24941:13;24936:2;24928:6;24924:15;24917:38;24732:230;:::o;24968:366::-;25110:3;25131:67;25195:2;25190:3;25131:67;:::i;:::-;25124:74;;25207:93;25296:3;25207:93;:::i;:::-;25325:2;25320:3;25316:12;25309:19;;24968:366;;;:::o;25340:419::-;25506:4;25544:2;25533:9;25529:18;25521:26;;25593:9;25587:4;25583:20;25579:1;25568:9;25564:17;25557:47;25621:131;25747:4;25621:131;:::i;:::-;25613:139;;25340:419;;;:::o;25765:233::-;25905:34;25901:1;25893:6;25889:14;25882:58;25974:16;25969:2;25961:6;25957:15;25950:41;25765:233;:::o;26004:366::-;26146:3;26167:67;26231:2;26226:3;26167:67;:::i;:::-;26160:74;;26243:93;26332:3;26243:93;:::i;:::-;26361:2;26356:3;26352:12;26345:19;;26004:366;;;:::o;26376:419::-;26542:4;26580:2;26569:9;26565:18;26557:26;;26629:9;26623:4;26619:20;26615:1;26604:9;26600:17;26593:47;26657:131;26783:4;26657:131;:::i;:::-;26649:139;;26376:419;;;:::o;26801:180::-;26849:77;26846:1;26839:88;26946:4;26943:1;26936:15;26970:4;26967:1;26960:15;26987:180;27127:32;27123:1;27115:6;27111:14;27104:56;26987:180;:::o;27173:366::-;27315:3;27336:67;27400:2;27395:3;27336:67;:::i;:::-;27329:74;;27412:93;27501:3;27412:93;:::i;:::-;27530:2;27525:3;27521:12;27514:19;;27173:366;;;:::o;27545:419::-;27711:4;27749:2;27738:9;27734:18;27726:26;;27798:9;27792:4;27788:20;27784:1;27773:9;27769:17;27762:47;27826:131;27952:4;27826:131;:::i;:::-;27818:139;;27545:419;;;:::o;27970:178::-;28110:30;28106:1;28098:6;28094:14;28087:54;27970:178;:::o;28154:366::-;28296:3;28317:67;28381:2;28376:3;28317:67;:::i;:::-;28310:74;;28393:93;28482:3;28393:93;:::i;:::-;28511:2;28506:3;28502:12;28495:19;;28154:366;;;:::o;28526:419::-;28692:4;28730:2;28719:9;28715:18;28707:26;;28779:9;28773:4;28769:20;28765:1;28754:9;28750:17;28743:47;28807:131;28933:4;28807:131;:::i;:::-;28799:139;;28526:419;;;:::o;28951:305::-;28991:3;29010:20;29028:1;29010:20;:::i;:::-;29005:25;;29044:20;29062:1;29044:20;:::i;:::-;29039:25;;29198:1;29130:66;29126:74;29123:1;29120:81;29117:107;;;29204:18;;:::i;:::-;29117:107;29248:1;29245;29241:9;29234:16;;28951:305;;;;:::o;29262:168::-;29402:20;29398:1;29390:6;29386:14;29379:44;29262:168;:::o;29436:366::-;29578:3;29599:67;29663:2;29658:3;29599:67;:::i;:::-;29592:74;;29675:93;29764:3;29675:93;:::i;:::-;29793:2;29788:3;29784:12;29777:19;;29436:366;;;:::o;29808:419::-;29974:4;30012:2;30001:9;29997:18;29989:26;;30061:9;30055:4;30051:20;30047:1;30036:9;30032:17;30025:47;30089:131;30215:4;30089:131;:::i;:::-;30081:139;;29808:419;;;:::o;30233:348::-;30273:7;30296:20;30314:1;30296:20;:::i;:::-;30291:25;;30330:20;30348:1;30330:20;:::i;:::-;30325:25;;30518:1;30450:66;30446:74;30443:1;30440:81;30435:1;30428:9;30421:17;30417:105;30414:131;;;30525:18;;:::i;:::-;30414:131;30573:1;30570;30566:9;30555:20;;30233:348;;;;:::o;30587:176::-;30727:28;30723:1;30715:6;30711:14;30704:52;30587:176;:::o;30769:366::-;30911:3;30932:67;30996:2;30991:3;30932:67;:::i;:::-;30925:74;;31008:93;31097:3;31008:93;:::i;:::-;31126:2;31121:3;31117:12;31110:19;;30769:366;;;:::o;31141:419::-;31307:4;31345:2;31334:9;31330:18;31322:26;;31394:9;31388:4;31384:20;31380:1;31369:9;31365:17;31358:47;31422:131;31548:4;31422:131;:::i;:::-;31414:139;;31141:419;;;:::o;31566:227::-;31706:34;31702:1;31694:6;31690:14;31683:58;31775:10;31770:2;31762:6;31758:15;31751:35;31566:227;:::o;31799:366::-;31941:3;31962:67;32026:2;32021:3;31962:67;:::i;:::-;31955:74;;32038:93;32127:3;32038:93;:::i;:::-;32156:2;32151:3;32147:12;32140:19;;31799:366;;;:::o;32171:419::-;32337:4;32375:2;32364:9;32360:18;32352:26;;32424:9;32418:4;32414:20;32410:1;32399:9;32395:17;32388:47;32452:131;32578:4;32452:131;:::i;:::-;32444:139;;32171:419;;;:::o;32596:181::-;32736:33;32732:1;32724:6;32720:14;32713:57;32596:181;:::o;32783:366::-;32925:3;32946:67;33010:2;33005:3;32946:67;:::i;:::-;32939:74;;33022:93;33111:3;33022:93;:::i;:::-;33140:2;33135:3;33131:12;33124:19;;32783:366;;;:::o;33155:419::-;33321:4;33359:2;33348:9;33344:18;33336:26;;33408:9;33402:4;33398:20;33394:1;33383:9;33379:17;33372:47;33436:131;33562:4;33436:131;:::i;:::-;33428:139;;33155:419;;;:::o;33580:250::-;33720:34;33716:1;33708:6;33704:14;33697:58;33789:33;33784:2;33776:6;33772:15;33765:58;33580:250;:::o;33836:366::-;33978:3;33999:67;34063:2;34058:3;33999:67;:::i;:::-;33992:74;;34075:93;34164:3;34075:93;:::i;:::-;34193:2;34188:3;34184:12;34177:19;;33836:366;;;:::o;34208:419::-;34374:4;34412:2;34401:9;34397:18;34389:26;;34461:9;34455:4;34451:20;34447:1;34436:9;34432:17;34425:47;34489:131;34615:4;34489:131;:::i;:::-;34481:139;;34208:419;;;:::o;34633:174::-;34773:26;34769:1;34761:6;34757:14;34750:50;34633:174;:::o;34813:366::-;34955:3;34976:67;35040:2;35035:3;34976:67;:::i;:::-;34969:74;;35052:93;35141:3;35052:93;:::i;:::-;35170:2;35165:3;35161:12;35154:19;;34813:366;;;:::o;35185:419::-;35351:4;35389:2;35378:9;35374:18;35366:26;;35438:9;35432:4;35428:20;35424:1;35413:9;35409:17;35402:47;35466:131;35592:4;35466:131;:::i;:::-;35458:139;;35185:419;;;:::o;35610:118::-;35647:7;35687:34;35680:5;35676:46;35665:57;;35610:118;;;:::o;35734:201::-;35773:3;35796:24;35814:5;35796:24;:::i;:::-;35787:33;;35842:34;35835:5;35832:45;35829:71;;;35880:18;;:::i;:::-;35829:71;35927:1;35920:5;35916:13;35909:20;;35734:201;;;:::o;35941:191::-;35981:4;36001:20;36019:1;36001:20;:::i;:::-;35996:25;;36035:20;36053:1;36035:20;:::i;:::-;36030:25;;36074:1;36071;36068:8;36065:34;;;36079:18;;:::i;:::-;36065:34;36124:1;36121;36117:9;36109:17;;35941:191;;;;:::o;36138:176::-;36278:28;36274:1;36266:6;36262:14;36255:52;36138:176;:::o;36320:366::-;36462:3;36483:67;36547:2;36542:3;36483:67;:::i;:::-;36476:74;;36559:93;36648:3;36559:93;:::i;:::-;36677:2;36672:3;36668:12;36661:19;;36320:366;;;:::o;36692:419::-;36858:4;36896:2;36885:9;36881:18;36873:26;;36945:9;36939:4;36935:20;36931:1;36920:9;36916:17;36909:47;36973:131;37099:4;36973:131;:::i;:::-;36965:139;;36692:419;;;:::o;37117:181::-;37257:33;37253:1;37245:6;37241:14;37234:57;37117:181;:::o;37304:366::-;37446:3;37467:67;37531:2;37526:3;37467:67;:::i;:::-;37460:74;;37543:93;37632:3;37543:93;:::i;:::-;37661:2;37656:3;37652:12;37645:19;;37304:366;;;:::o;37676:419::-;37842:4;37880:2;37869:9;37865:18;37857:26;;37929:9;37923:4;37919:20;37915:1;37904:9;37900:17;37893:47;37957:131;38083:4;37957:131;:::i;:::-;37949:139;;37676:419;;;:::o;38101:238::-;38241:34;38237:1;38229:6;38225:14;38218:58;38310:21;38305:2;38297:6;38293:15;38286:46;38101:238;:::o;38345:366::-;38487:3;38508:67;38572:2;38567:3;38508:67;:::i;:::-;38501:74;;38584:93;38673:3;38584:93;:::i;:::-;38702:2;38697:3;38693:12;38686:19;;38345:366;;;:::o;38717:419::-;38883:4;38921:2;38910:9;38906:18;38898:26;;38970:9;38964:4;38960:20;38956:1;38945:9;38941:17;38934:47;38998:131;39124:4;38998:131;:::i;:::-;38990:139;;38717:419;;;:::o;39142:234::-;39282:34;39278:1;39270:6;39266:14;39259:58;39351:17;39346:2;39338:6;39334:15;39327:42;39142:234;:::o;39382:366::-;39524:3;39545:67;39609:2;39604:3;39545:67;:::i;:::-;39538:74;;39621:93;39710:3;39621:93;:::i;:::-;39739:2;39734:3;39730:12;39723:19;;39382:366;;;:::o;39754:419::-;39920:4;39958:2;39947:9;39943:18;39935:26;;40007:9;40001:4;39997:20;39993:1;39982:9;39978:17;39971:47;40035:131;40161:4;40035:131;:::i;:::-;40027:139;;39754:419;;;:::o;40179:148::-;40281:11;40318:3;40303:18;;40179:148;;;;:::o;40333:377::-;40439:3;40467:39;40500:5;40467:39;:::i;:::-;40522:89;40604:6;40599:3;40522:89;:::i;:::-;40515:96;;40620:52;40665:6;40660:3;40653:4;40646:5;40642:16;40620:52;:::i;:::-;40697:6;40692:3;40688:16;40681:23;;40443:267;40333:377;;;;:::o;40716:155::-;40856:7;40852:1;40844:6;40840:14;40833:31;40716:155;:::o;40877:400::-;41037:3;41058:84;41140:1;41135:3;41058:84;:::i;:::-;41051:91;;41151:93;41240:3;41151:93;:::i;:::-;41269:1;41264:3;41260:11;41253:18;;40877:400;;;:::o;41283:701::-;41564:3;41586:95;41677:3;41668:6;41586:95;:::i;:::-;41579:102;;41698:95;41789:3;41780:6;41698:95;:::i;:::-;41691:102;;41810:148;41954:3;41810:148;:::i;:::-;41803:155;;41975:3;41968:10;;41283:701;;;;;:::o;41990:225::-;42130:34;42126:1;42118:6;42114:14;42107:58;42199:8;42194:2;42186:6;42182:15;42175:33;41990:225;:::o;42221:366::-;42363:3;42384:67;42448:2;42443:3;42384:67;:::i;:::-;42377:74;;42460:93;42549:3;42460:93;:::i;:::-;42578:2;42573:3;42569:12;42562:19;;42221:366;;;:::o;42593:419::-;42759:4;42797:2;42786:9;42782:18;42774:26;;42846:9;42840:4;42836:20;42832:1;42821:9;42817:17;42810:47;42874:131;43000:4;42874:131;:::i;:::-;42866:139;;42593:419;;;:::o;43018:237::-;43158:34;43154:1;43146:6;43142:14;43135:58;43227:20;43222:2;43214:6;43210:15;43203:45;43018:237;:::o;43261:366::-;43403:3;43424:67;43488:2;43483:3;43424:67;:::i;:::-;43417:74;;43500:93;43589:3;43500:93;:::i;:::-;43618:2;43613:3;43609:12;43602:19;;43261:366;;;:::o;43633:419::-;43799:4;43837:2;43826:9;43822:18;43814:26;;43886:9;43880:4;43876:20;43872:1;43861:9;43857:17;43850:47;43914:131;44040:4;43914:131;:::i;:::-;43906:139;;43633:419;;;:::o;44058:225::-;44198:34;44194:1;44186:6;44182:14;44175:58;44267:8;44262:2;44254:6;44250:15;44243:33;44058:225;:::o;44289:366::-;44431:3;44452:67;44516:2;44511:3;44452:67;:::i;:::-;44445:74;;44528:93;44617:3;44528:93;:::i;:::-;44646:2;44641:3;44637:12;44630:19;;44289:366;;;:::o;44661:419::-;44827:4;44865:2;44854:9;44850:18;44842:26;;44914:9;44908:4;44904:20;44900:1;44889:9;44885:17;44878:47;44942:131;45068:4;44942:131;:::i;:::-;44934:139;;44661:419;;;:::o;45086:224::-;45226:34;45222:1;45214:6;45210:14;45203:58;45295:7;45290:2;45282:6;45278:15;45271:32;45086:224;:::o;45316:366::-;45458:3;45479:67;45543:2;45538:3;45479:67;:::i;:::-;45472:74;;45555:93;45644:3;45555:93;:::i;:::-;45673:2;45668:3;45664:12;45657:19;;45316:366;;;:::o;45688:419::-;45854:4;45892:2;45881:9;45877:18;45869:26;;45941:9;45935:4;45931:20;45927:1;45916:9;45912:17;45905:47;45969:131;46095:4;45969:131;:::i;:::-;45961:139;;45688:419;;;:::o;46113:191::-;46153:4;46173:20;46191:1;46173:20;:::i;:::-;46168:25;;46207:20;46225:1;46207:20;:::i;:::-;46202:25;;46246:1;46243;46240:8;46237:34;;;46251:18;;:::i;:::-;46237:34;46296:1;46293;46289:9;46281:17;;46113:191;;;;:::o;46310:273::-;46350:3;46369:20;46387:1;46369:20;:::i;:::-;46364:25;;46403:20;46421:1;46403:20;:::i;:::-;46398:25;;46525:1;46489:34;46485:42;46482:1;46479:49;46476:75;;;46531:18;;:::i;:::-;46476:75;46575:1;46572;46568:9;46561:16;;46310:273;;;;:::o;46589:229::-;46729:34;46725:1;46717:6;46713:14;46706:58;46798:12;46793:2;46785:6;46781:15;46774:37;46589:229;:::o;46824:366::-;46966:3;46987:67;47051:2;47046:3;46987:67;:::i;:::-;46980:74;;47063:93;47152:3;47063:93;:::i;:::-;47181:2;47176:3;47172:12;47165:19;;46824:366;;;:::o;47196:419::-;47362:4;47400:2;47389:9;47385:18;47377:26;;47449:9;47443:4;47439:20;47435:1;47424:9;47420:17;47413:47;47477:131;47603:4;47477:131;:::i;:::-;47469:139;;47196:419;;;:::o;47621:171::-;47660:3;47683:24;47701:5;47683:24;:::i;:::-;47674:33;;47729:4;47722:5;47719:15;47716:41;;;47737:18;;:::i;:::-;47716:41;47784:1;47777:5;47773:13;47766:20;;47621:171;;;:::o;47798:234::-;47938:34;47934:1;47926:6;47922:14;47915:58;48007:17;48002:2;47994:6;47990:15;47983:42;47798:234;:::o;48038:366::-;48180:3;48201:67;48265:2;48260:3;48201:67;:::i;:::-;48194:74;;48277:93;48366:3;48277:93;:::i;:::-;48395:2;48390:3;48386:12;48379:19;;48038:366;;;:::o;48410:419::-;48576:4;48614:2;48603:9;48599:18;48591:26;;48663:9;48657:4;48653:20;48649:1;48638:9;48634:17;48627:47;48691:131;48817:4;48691:131;:::i;:::-;48683:139;;48410:419;;;:::o;48835:98::-;48886:6;48920:5;48914:12;48904:22;;48835:98;;;:::o;48939:168::-;49022:11;49056:6;49051:3;49044:19;49096:4;49091:3;49087:14;49072:29;;48939:168;;;;:::o;49113:360::-;49199:3;49227:38;49259:5;49227:38;:::i;:::-;49281:70;49344:6;49339:3;49281:70;:::i;:::-;49274:77;;49360:52;49405:6;49400:3;49393:4;49386:5;49382:16;49360:52;:::i;:::-;49437:29;49459:6;49437:29;:::i;:::-;49432:3;49428:39;49421:46;;49203:270;49113:360;;;;:::o;49479:640::-;49674:4;49712:3;49701:9;49697:19;49689:27;;49726:71;49794:1;49783:9;49779:17;49770:6;49726:71;:::i;:::-;49807:72;49875:2;49864:9;49860:18;49851:6;49807:72;:::i;:::-;49889;49957:2;49946:9;49942:18;49933:6;49889:72;:::i;:::-;50008:9;50002:4;49998:20;49993:2;49982:9;49978:18;49971:48;50036:76;50107:4;50098:6;50036:76;:::i;:::-;50028:84;;49479:640;;;;;;;:::o;50125:141::-;50181:5;50212:6;50206:13;50197:22;;50228:32;50254:5;50228:32;:::i;:::-;50125:141;;;;:::o;50272:349::-;50341:6;50390:2;50378:9;50369:7;50365:23;50361:32;50358:119;;;50396:79;;:::i;:::-;50358:119;50516:1;50541:63;50596:7;50587:6;50576:9;50572:22;50541:63;:::i;:::-;50531:73;;50487:127;50272:349;;;;:::o;50627:180::-;50675:77;50672:1;50665:88;50772:4;50769:1;50762:15;50796:4;50793:1;50786:15;50813:185;50853:1;50870:20;50888:1;50870:20;:::i;:::-;50865:25;;50904:20;50922:1;50904:20;:::i;:::-;50899:25;;50943:1;50933:35;;50948:18;;:::i;:::-;50933:35;50990:1;50987;50983:9;50978:14;;50813:185;;;;:::o;51004:176::-;51036:1;51053:20;51071:1;51053:20;:::i;:::-;51048:25;;51087:20;51105:1;51087:20;:::i;:::-;51082:25;;51126:1;51116:35;;51131:18;;:::i;:::-;51116:35;51172:1;51169;51165:9;51160:14;;51004:176;;;;:::o;51186:236::-;51326:34;51322:1;51314:6;51310:14;51303:58;51395:19;51390:2;51382:6;51378:15;51371:44;51186:236;:::o;51428:366::-;51570:3;51591:67;51655:2;51650:3;51591:67;:::i;:::-;51584:74;;51667:93;51756:3;51667:93;:::i;:::-;51785:2;51780:3;51776:12;51769:19;;51428:366;;;:::o;51800:419::-;51966:4;52004:2;51993:9;51989:18;51981:26;;52053:9;52047:4;52043:20;52039:1;52028:9;52024:17;52017:47;52081:131;52207:4;52081:131;:::i;:::-;52073:139;;51800:419;;;:::o;52225:220::-;52365:34;52361:1;52353:6;52349:14;52342:58;52434:3;52429:2;52421:6;52417:15;52410:28;52225:220;:::o;52451:366::-;52593:3;52614:67;52678:2;52673:3;52614:67;:::i;:::-;52607:74;;52690:93;52779:3;52690:93;:::i;:::-;52808:2;52803:3;52799:12;52792:19;;52451:366;;;:::o;52823:419::-;52989:4;53027:2;53016:9;53012:18;53004:26;;53076:9;53070:4;53066:20;53062:1;53051:9;53047:17;53040:47;53104:131;53230:4;53104:131;:::i;:::-;53096:139;;52823:419;;;:::o;53248:179::-;53388:31;53384:1;53376:6;53372:14;53365:55;53248:179;:::o;53433:366::-;53575:3;53596:67;53660:2;53655:3;53596:67;:::i;:::-;53589:74;;53672:93;53761:3;53672:93;:::i;:::-;53790:2;53785:3;53781:12;53774:19;;53433:366;;;:::o;53805:419::-;53971:4;54009:2;53998:9;53994:18;53986:26;;54058:9;54052:4;54048:20;54044:1;54033:9;54029:17;54022:47;54086:131;54212:4;54086:131;:::i;:::-;54078:139;;53805:419;;;:::o;54230:221::-;54370:34;54366:1;54358:6;54354:14;54347:58;54439:4;54434:2;54426:6;54422:15;54415:29;54230:221;:::o;54457:366::-;54599:3;54620:67;54684:2;54679:3;54620:67;:::i;:::-;54613:74;;54696:93;54785:3;54696:93;:::i;:::-;54814:2;54809:3;54805:12;54798:19;;54457:366;;;:::o;54829:419::-;54995:4;55033:2;55022:9;55018:18;55010:26;;55082:9;55076:4;55072:20;55068:1;55057:9;55053:17;55046:47;55110:131;55236:4;55110:131;:::i;:::-;55102:139;;54829:419;;;:::o
Swarm Source
ipfs://38856c28fbe6e2b326dae57a1e3f9cfb87e3535e810a64747ac8afb1db08550c
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.