ERC-721
Overview
Max Total Supply
409 GOCKS
Holders
43
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 GOCKSLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
GummyGocks
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-09 */ // SPDX-License-Identifier: MIT // 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/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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 (last updated v4.5.0) (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); /** * @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: @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/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: 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.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public 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: @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: contracts/GummyGocks.sol pragma solidity ^0.8.0; contract GummyGocks is Ownable, ERC721A, ReentrancyGuard { uint256 public immutable maxPerAddressDuringMint; uint256 public FREE_MINT_LIMIT_PER_WALLET; bool public PAUSED = true; uint256 public PRICE = 0.005 ether; mapping(address => uint256) private freeMintCountMap; struct SaleConfig { uint64 publicPrice; bool paused; } SaleConfig public saleConfig; constructor( uint256 freeMintAllowance ) ERC721A("Gummy Gocks", "GOCKS", 20, 6969) { FREE_MINT_LIMIT_PER_WALLET = freeMintAllowance; maxPerAddressDuringMint = 20; } modifier callerIsUser() { require(tx.origin == msg.sender, "The caller is another contract"); _; } function privateMint(address[] memory addresses, uint256 quantity) external onlyOwner { require(totalSupply() + quantity <= collectionSize, "reached max supply"); for (uint256 i = 0; i < addresses.length; i++) { _safeMint(addresses[i], quantity); } } function publicMint(uint256 quantity) external payable callerIsUser { bool state = PAUSED; uint256 publicPrice = PRICE; require( isPublicSaleOn(publicPrice, state), "public sale has not begun yet" ); require( numberMinted(msg.sender) + quantity <= maxPerAddressDuringMint, "can not mint this many" ); require(totalSupply() + quantity <= collectionSize, "reached max supply"); uint256 price = publicPrice * quantity; uint256 remainingFreeMint = FREE_MINT_LIMIT_PER_WALLET - freeMintCountMap[msg.sender]; if (remainingFreeMint > 0) { if (quantity >= remainingFreeMint) { price -= remainingFreeMint * publicPrice; updateFreeMintCount(msg.sender, remainingFreeMint); } else { price -= quantity * publicPrice; updateFreeMintCount(msg.sender, quantity); } } _safeMint(msg.sender, quantity); refundIfOver(price); } function refundIfOver(uint256 price) private { require(msg.value >= price, "Need to send more ETH."); if (msg.value > price) { payable(msg.sender).transfer(msg.value - price); } } function setSalePaused(bool saleIsPaused) external onlyOwner { PAUSED = saleIsPaused; } function isPublicSaleOn( uint256 publicPriceWei, bool state ) internal view returns (bool) { return publicPriceWei != 0 && !state; } function setFreeMintAllowance(uint256 freeMintAllowance) external onlyOwner { FREE_MINT_LIMIT_PER_WALLET = freeMintAllowance; } function updateFreeMintCount(address minter, uint256 count) private { freeMintCountMap[minter] += count; } // For marketing etc. function devMint(uint256 quantity) external onlyOwner { require(totalSupply() + quantity <= collectionSize, "reached max supply"); require( quantity % maxBatchSize == 0, "can only mint a multiple of the maxBatchSize" ); uint256 numChunks = quantity / maxBatchSize; for (uint256 i = 0; i < numChunks; i++) { _safeMint(msg.sender, maxBatchSize); } } // // metadata URI string private _baseTokenURI; function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function setBaseURI(string calldata baseURI) external onlyOwner { _baseTokenURI = baseURI; } function withdrawMoney() external onlyOwner nonReentrant { (bool success, ) = msg.sender.call{value: address(this).balance}(""); require(success, "Transfer failed."); } function setOwnersExplicit(uint256 quantity) external onlyOwner nonReentrant { _setOwnersExplicit(quantity); } function numberMinted(address owner) public view returns (uint256) { return _numberMinted(owner); } function getOwnershipData(uint256 tokenId) external view returns (TokenOwnership memory) { return ownershipOf(tokenId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"freeMintAllowance","type":"uint256"}],"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":"FREE_MINT_LIMIT_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSED","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"maxPerAddressDuringMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"numberMinted","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":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"privateMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","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":[],"name":"saleConfig","outputs":[{"internalType":"uint64","name":"publicPrice","type":"uint64"},{"internalType":"bool","name":"paused","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"freeMintAllowance","type":"uint256"}],"name":"setFreeMintAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"setOwnersExplicit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"saleIsPaused","type":"bool"}],"name":"setSalePaused","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":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60e0604052600060015560006008556001600b60006101000a81548160ff0219169083151502179055506611c37937e08000600c553480156200004157600080fd5b5060405162005a0b38038062005a0b83398181016040528101906200006791906200037c565b6040518060400160405280600b81526020017f47756d6d7920476f636b730000000000000000000000000000000000000000008152506040518060400160405280600581526020017f474f434b530000000000000000000000000000000000000000000000000000008152506014611b39620000f8620000ec620001e960201b60201c565b620001f160201b60201c565b600081116200013e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001359062000418565b60405180910390fd5b6000821162000184576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200017b90620003f6565b60405180910390fd5b83600290805190602001906200019c929190620002b5565b508260039080519060200190620001b5929190620002b5565b508160a08181525050806080818152505050505050600160098190555080600a81905550601460c081815250505062000572565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002c39062000455565b90600052602060002090601f016020900481019282620002e7576000855562000333565b82601f106200030257805160ff191683800117855562000333565b8280016001018555821562000333579182015b828111156200033257825182559160200191906001019062000315565b5b50905062000342919062000346565b5090565b5b808211156200036157600081600090555060010162000347565b5090565b600081519050620003768162000558565b92915050565b6000602082840312156200038f57600080fd5b60006200039f8482850162000365565b91505092915050565b6000620003b76027836200043a565b9150620003c482620004ba565b604082019050919050565b6000620003de602e836200043a565b9150620003eb8262000509565b604082019050919050565b600060208201905081810360008301526200041181620003a8565b9050919050565b600060208201905081810360008301526200043381620003cf565b9050919050565b600082825260208201905092915050565b6000819050919050565b600060028204905060018216806200046e57607f821691505b602082108114156200048557620004846200048b565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f455243373231413a206d61782062617463682073697a65206d7573742062652060008201527f6e6f6e7a65726f00000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008201527f6e6f6e7a65726f20737570706c79000000000000000000000000000000000000602082015250565b62000563816200044b565b81146200056f57600080fd5b50565b60805160a05160c051615423620005e860003960008181610d9c0152611724015260008181611250015281816112be015281816112fb01528181612a2b01528181612a54015261322b015260008181610e12015281816111d9015281816114d00152818161268201526126b601526154236000f3fe6080604052600436106102045760003560e01c8063715018a611610118578063a9aad58c116100a0578063c87b56dd1161006f578063c87b56dd14610745578063d7224ba014610782578063dc33e681146107ad578063e985e9c5146107ea578063f2fde38b1461082757610204565b8063a9aad58c146106b1578063ac446002146106dc578063b0551ac4146106f3578063b88d4fde1461071c57610204565b80638da5cb5b116100e75780638da5cb5b146105c957806390aa0b0f146105f45780639231ab2a1461062057806395d89b411461065d578063a22cb4651461068857610204565b8063715018a6146105335780638bc35c2f1461054a5780638d859f3e146105755780638d92becd146105a057610204565b80632db115441161019b5780634f6ccce71161016a5780634f6ccce71461042a57806355f804b3146104675780636352211e1461049057806366a44155146104cd57806370a08231146104f657610204565b80632db115441461037f5780632f745c591461039b578063375a069a146103d857806342842e0e1461040157610204565b806310b0c052116101d757806310b0c052146102d757806318160ddd1461030257806323b872dd1461032d5780632d20fb601461035657610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190613b1e565b610850565b60405161023d919061420a565b60405180910390f35b34801561025257600080fd5b5061025b61099a565b6040516102689190614225565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190613bb5565b610a2c565b6040516102a591906141a3565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d09190613a65565b610ab1565b005b3480156102e357600080fd5b506102ec610bca565b6040516102f99190614642565b60405180910390f35b34801561030e57600080fd5b50610317610bd0565b6040516103249190614642565b60405180910390f35b34801561033957600080fd5b50610354600480360381019061034f919061395f565b610bda565b005b34801561036257600080fd5b5061037d60048036038101906103789190613bb5565b610bea565b005b61039960048036038101906103949190613bb5565b610cc8565b005b3480156103a757600080fd5b506103c260048036038101906103bd9190613a65565b610f5d565b6040516103cf9190614642565b60405180910390f35b3480156103e457600080fd5b506103ff60048036038101906103fa9190613bb5565b61115b565b005b34801561040d57600080fd5b506104286004803603810190610423919061395f565b611337565b005b34801561043657600080fd5b50610451600480360381019061044c9190613bb5565b611357565b60405161045e9190614642565b60405180910390f35b34801561047357600080fd5b5061048e60048036038101906104899190613b70565b6113aa565b005b34801561049c57600080fd5b506104b760048036038101906104b29190613bb5565b61143c565b6040516104c491906141a3565b60405180910390f35b3480156104d957600080fd5b506104f460048036038101906104ef9190613aa1565b611452565b005b34801561050257600080fd5b5061051d600480360381019061051891906138fa565b6115b1565b60405161052a9190614642565b60405180910390f35b34801561053f57600080fd5b5061054861169a565b005b34801561055657600080fd5b5061055f611722565b60405161056c9190614642565b60405180910390f35b34801561058157600080fd5b5061058a611746565b6040516105979190614642565b60405180910390f35b3480156105ac57600080fd5b506105c760048036038101906105c29190613af5565b61174c565b005b3480156105d557600080fd5b506105de6117e5565b6040516105eb91906141a3565b60405180910390f35b34801561060057600080fd5b5061060961180e565b60405161061792919061465d565b60405180910390f35b34801561062c57600080fd5b5061064760048036038101906106429190613bb5565b611841565b6040516106549190614627565b60405180910390f35b34801561066957600080fd5b50610672611859565b60405161067f9190614225565b60405180910390f35b34801561069457600080fd5b506106af60048036038101906106aa9190613a29565b6118eb565b005b3480156106bd57600080fd5b506106c6611a6c565b6040516106d3919061420a565b60405180910390f35b3480156106e857600080fd5b506106f1611a7f565b005b3480156106ff57600080fd5b5061071a60048036038101906107159190613bb5565b611c00565b005b34801561072857600080fd5b50610743600480360381019061073e91906139ae565b611c86565b005b34801561075157600080fd5b5061076c60048036038101906107679190613bb5565b611ce2565b6040516107799190614225565b60405180910390f35b34801561078e57600080fd5b50610797611d89565b6040516107a49190614642565b60405180910390f35b3480156107b957600080fd5b506107d460048036038101906107cf91906138fa565b611d8f565b6040516107e19190614642565b60405180910390f35b3480156107f657600080fd5b50610811600480360381019061080c9190613923565b611da1565b60405161081e919061420a565b60405180910390f35b34801561083357600080fd5b5061084e600480360381019061084991906138fa565b611e35565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061091b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061098357507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610993575061099282611f2d565b5b9050919050565b6060600280546109a9906149f5565b80601f01602080910402602001604051908101604052809291908181526020018280546109d5906149f5565b8015610a225780601f106109f757610100808354040283529160200191610a22565b820191906000526020600020905b815481529060010190602001808311610a0557829003601f168201915b5050505050905090565b6000610a3782611f97565b610a76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6d906145e7565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610abc8261143c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2490614487565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b4c611fa5565b73ffffffffffffffffffffffffffffffffffffffff161480610b7b5750610b7a81610b75611fa5565b611da1565b5b610bba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb190614347565b60405180910390fd5b610bc5838383611fad565b505050565b600a5481565b6000600154905090565b610be583838361205f565b505050565b610bf2611fa5565b73ffffffffffffffffffffffffffffffffffffffff16610c106117e5565b73ffffffffffffffffffffffffffffffffffffffff1614610c66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5d906143e7565b60405180910390fd5b60026009541415610cac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca3906145a7565b60405180910390fd5b6002600981905550610cbd81612618565b600160098190555050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614327565b60405180910390fd5b6000600b60009054906101000a900460ff1690506000600c549050610d5b81836128a6565b610d9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9190614467565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000083610dc533611d8f565b610dcf919061479c565b1115610e10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0790614547565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000083610e3a610bd0565b610e44919061479c565b1115610e85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7c906143a7565b60405180910390fd5b60008382610e939190614823565b90506000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600a54610ee491906148b1565b90506000811115610f4357808510610f1e578281610f029190614823565b82610f0d91906148b1565b9150610f1933826128be565b610f42565b8285610f2a9190614823565b82610f3591906148b1565b9150610f4133866128be565b5b5b610f4d3386612918565b610f5682612936565b5050505050565b6000610f68836115b1565b8210610fa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa090614247565b60405180910390fd5b6000610fb3610bd0565b905060008060005b83811015611119576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146110ad57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561110557868414156110f6578195505050505050611155565b838061110190614a58565b9450505b50808061111190614a58565b915050610fbb565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114c90614567565b60405180910390fd5b92915050565b611163611fa5565b73ffffffffffffffffffffffffffffffffffffffff166111816117e5565b73ffffffffffffffffffffffffffffffffffffffff16146111d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ce906143e7565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081611201610bd0565b61120b919061479c565b111561124c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611243906143a7565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000008261127a9190614aa1565b146112ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b1906142a7565b60405180910390fd5b60007f0000000000000000000000000000000000000000000000000000000000000000826112e891906147f2565b905060005b818110156113325761131f337f0000000000000000000000000000000000000000000000000000000000000000612918565b808061132a90614a58565b9150506112ed565b505050565b61135283838360405180602001604052806000815250611c86565b505050565b6000611361610bd0565b82106113a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611399906142c7565b60405180910390fd5b819050919050565b6113b2611fa5565b73ffffffffffffffffffffffffffffffffffffffff166113d06117e5565b73ffffffffffffffffffffffffffffffffffffffff1614611426576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141d906143e7565b60405180910390fd5b8181600f919061143792919061366c565b505050565b6000611447826129d7565b600001519050919050565b61145a611fa5565b73ffffffffffffffffffffffffffffffffffffffff166114786117e5565b73ffffffffffffffffffffffffffffffffffffffff16146114ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c5906143e7565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000816114f8610bd0565b611502919061479c565b1115611543576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153a906143a7565b60405180910390fd5b60005b82518110156115ac5761159983828151811061158b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015183612918565b80806115a490614a58565b915050611546565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611622576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161990614387565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6116a2611fa5565b73ffffffffffffffffffffffffffffffffffffffff166116c06117e5565b73ffffffffffffffffffffffffffffffffffffffff1614611716576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170d906143e7565b60405180910390fd5b6117206000612bda565b565b7f000000000000000000000000000000000000000000000000000000000000000081565b600c5481565b611754611fa5565b73ffffffffffffffffffffffffffffffffffffffff166117726117e5565b73ffffffffffffffffffffffffffffffffffffffff16146117c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bf906143e7565b60405180910390fd5b80600b60006101000a81548160ff02191690831515021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e8060000160009054906101000a900467ffffffffffffffff16908060000160089054906101000a900460ff16905082565b6118496136f2565b611852826129d7565b9050919050565b606060038054611868906149f5565b80601f0160208091040260200160405190810160405280929190818152602001828054611894906149f5565b80156118e15780601f106118b6576101008083540402835291602001916118e1565b820191906000526020600020905b8154815290600101906020018083116118c457829003601f168201915b5050505050905090565b6118f3611fa5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611961576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195890614427565b60405180910390fd5b806007600061196e611fa5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a1b611fa5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a60919061420a565b60405180910390a35050565b600b60009054906101000a900460ff1681565b611a87611fa5565b73ffffffffffffffffffffffffffffffffffffffff16611aa56117e5565b73ffffffffffffffffffffffffffffffffffffffff1614611afb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af2906143e7565b60405180910390fd5b60026009541415611b41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b38906145a7565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051611b6f9061418e565b60006040518083038185875af1925050503d8060008114611bac576040519150601f19603f3d011682016040523d82523d6000602084013e611bb1565b606091505b5050905080611bf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bec906144a7565b60405180910390fd5b506001600981905550565b611c08611fa5565b73ffffffffffffffffffffffffffffffffffffffff16611c266117e5565b73ffffffffffffffffffffffffffffffffffffffff1614611c7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c73906143e7565b60405180910390fd5b80600a8190555050565b611c9184848461205f565b611c9d84848484612c9e565b611cdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd3906144c7565b60405180910390fd5b50505050565b6060611ced82611f97565b611d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2390614407565b60405180910390fd5b6000611d36612e35565b90506000815111611d565760405180602001604052806000815250611d81565b80611d6084612ec7565b604051602001611d7192919061416a565b6040516020818303038152906040525b915050919050565b60085481565b6000611d9a82613074565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611e3d611fa5565b73ffffffffffffffffffffffffffffffffffffffff16611e5b6117e5565b73ffffffffffffffffffffffffffffffffffffffff1614611eb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea8906143e7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1890614267565b60405180910390fd5b611f2a81612bda565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600060015482109050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061206a826129d7565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612091611fa5565b73ffffffffffffffffffffffffffffffffffffffff1614806120ed57506120b6611fa5565b73ffffffffffffffffffffffffffffffffffffffff166120d584610a2c565b73ffffffffffffffffffffffffffffffffffffffff16145b8061210957506121088260000151612103611fa5565b611da1565b5b90508061214b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214290614447565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146121bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b4906143c7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561222d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612224906142e7565b60405180910390fd5b61223a858585600161315d565b61224a6000848460000151611fad565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166122b8919061487d565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff1661235c9190614756565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184612462919061479c565b9050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156125a8576124d881611f97565b156125a7576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506004600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126108686866001613163565b505050505050565b6000600854905060008211612662576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265990614367565b60405180910390fd5b600060018383612672919061479c565b61267c91906148b1565b905060017f00000000000000000000000000000000000000000000000000000000000000006126ab91906148b1565b8111156126e25760017f00000000000000000000000000000000000000000000000000000000000000006126df91906148b1565b90505b6126eb81611f97565b61272a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272190614587565b60405180910390fd5b60008290505b81811161288d57600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561287a5760006127ad826129d7565b90506040518060400160405280826000015173ffffffffffffffffffffffffffffffffffffffff168152602001826020015167ffffffffffffffff168152506004600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050505b808061288590614a58565b915050612730565b5060018161289b919061479c565b600881905550505050565b60008083141580156128b6575081155b905092915050565b80600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461290d919061479c565b925050819055505050565b612932828260405180602001604052806000815250613169565b5050565b80341015612979576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612970906144e7565b60405180910390fd5b803411156129d4573373ffffffffffffffffffffffffffffffffffffffff166108fc82346129a791906148b1565b9081150290604051600060405180830381858888f193505050501580156129d2573d6000803e3d6000fd5b505b50565b6129df6136f2565b6129e882611f97565b612a27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1e90614287565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000008310612a8b5760017f000000000000000000000000000000000000000000000000000000000000000084612a7e91906148b1565b612a88919061479c565b90505b60008390505b818110612b99576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612b8557809350505050612bd5565b508080612b91906149cb565b915050612a91565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bcc906145c7565b60405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612cbf8473ffffffffffffffffffffffffffffffffffffffff16613649565b15612e28578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ce8611fa5565b8786866040518563ffffffff1660e01b8152600401612d0a94939291906141be565b602060405180830381600087803b158015612d2457600080fd5b505af1925050508015612d5557506040513d601f19601f82011682018060405250810190612d529190613b47565b60015b612dd8573d8060008114612d85576040519150601f19603f3d011682016040523d82523d6000602084013e612d8a565b606091505b50600081511415612dd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc7906144c7565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e2d565b600190505b949350505050565b6060600f8054612e44906149f5565b80601f0160208091040260200160405190810160405280929190818152602001828054612e70906149f5565b8015612ebd5780601f10612e9257610100808354040283529160200191612ebd565b820191906000526020600020905b815481529060010190602001808311612ea057829003601f168201915b5050505050905090565b60606000821415612f0f576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061306f565b600082905060005b60008214612f41578080612f2a90614a58565b915050600a82612f3a91906147f2565b9150612f17565b60008167ffffffffffffffff811115612f83577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612fb55781602001600182028036833780820191505090505b5090505b6000851461306857600182612fce91906148b1565b9150600a85612fdd9190614aa1565b6030612fe9919061479c565b60f81b818381518110613025577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561306191906147f2565b9450612fb9565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130dc90614307565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b50505050565b50505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156131e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131d790614527565b60405180910390fd5b6131e981611f97565b15613229576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161322090614507565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000083111561328c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161328390614607565b60405180910390fd5b613299600085838661315d565b6000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516133969190614756565b6fffffffffffffffffffffffffffffffff1681526020018583602001516133bd9190614756565b6fffffffffffffffffffffffffffffffff16815250600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561362c57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46135cc6000888488612c9e565b61360b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613602906144c7565b60405180910390fd5b818061361690614a58565b925050808061362490614a58565b91505061355b565b50806001819055506136416000878588613163565b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054613678906149f5565b90600052602060002090601f01602090048101928261369a57600085556136e1565b82601f106136b357803560ff19168380011785556136e1565b828001600101855582156136e1579182015b828111156136e05782358255916020019190600101906136c5565b5b5090506136ee919061372c565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b8082111561374557600081600090555060010161372d565b5090565b600061375c613757846146ab565b614686565b9050808382526020820190508285602086028201111561377b57600080fd5b60005b858110156137ab578161379188826137f3565b84526020840193506020830192505060018101905061377e565b5050509392505050565b60006137c86137c3846146d7565b614686565b9050828152602081018484840111156137e057600080fd5b6137eb848285614989565b509392505050565b60008135905061380281615391565b92915050565b600082601f83011261381957600080fd5b8135613829848260208601613749565b91505092915050565b600081359050613841816153a8565b92915050565b600081359050613856816153bf565b92915050565b60008151905061386b816153bf565b92915050565b600082601f83011261388257600080fd5b81356138928482602086016137b5565b91505092915050565b60008083601f8401126138ad57600080fd5b8235905067ffffffffffffffff8111156138c657600080fd5b6020830191508360018202830111156138de57600080fd5b9250929050565b6000813590506138f4816153d6565b92915050565b60006020828403121561390c57600080fd5b600061391a848285016137f3565b91505092915050565b6000806040838503121561393657600080fd5b6000613944858286016137f3565b9250506020613955858286016137f3565b9150509250929050565b60008060006060848603121561397457600080fd5b6000613982868287016137f3565b9350506020613993868287016137f3565b92505060406139a4868287016138e5565b9150509250925092565b600080600080608085870312156139c457600080fd5b60006139d2878288016137f3565b94505060206139e3878288016137f3565b93505060406139f4878288016138e5565b925050606085013567ffffffffffffffff811115613a1157600080fd5b613a1d87828801613871565b91505092959194509250565b60008060408385031215613a3c57600080fd5b6000613a4a858286016137f3565b9250506020613a5b85828601613832565b9150509250929050565b60008060408385031215613a7857600080fd5b6000613a86858286016137f3565b9250506020613a97858286016138e5565b9150509250929050565b60008060408385031215613ab457600080fd5b600083013567ffffffffffffffff811115613ace57600080fd5b613ada85828601613808565b9250506020613aeb858286016138e5565b9150509250929050565b600060208284031215613b0757600080fd5b6000613b1584828501613832565b91505092915050565b600060208284031215613b3057600080fd5b6000613b3e84828501613847565b91505092915050565b600060208284031215613b5957600080fd5b6000613b678482850161385c565b91505092915050565b60008060208385031215613b8357600080fd5b600083013567ffffffffffffffff811115613b9d57600080fd5b613ba98582860161389b565b92509250509250929050565b600060208284031215613bc757600080fd5b6000613bd5848285016138e5565b91505092915050565b613be7816148e5565b82525050565b613bf6816148e5565b82525050565b613c05816148f7565b82525050565b6000613c1682614708565b613c20818561471e565b9350613c30818560208601614998565b613c3981614b8e565b840191505092915050565b6000613c4f82614713565b613c59818561473a565b9350613c69818560208601614998565b613c7281614b8e565b840191505092915050565b6000613c8882614713565b613c92818561474b565b9350613ca2818560208601614998565b80840191505092915050565b6000613cbb60228361473a565b9150613cc682614b9f565b604082019050919050565b6000613cde60268361473a565b9150613ce982614bee565b604082019050919050565b6000613d01602a8361473a565b9150613d0c82614c3d565b604082019050919050565b6000613d24602c8361473a565b9150613d2f82614c8c565b604082019050919050565b6000613d4760238361473a565b9150613d5282614cdb565b604082019050919050565b6000613d6a60258361473a565b9150613d7582614d2a565b604082019050919050565b6000613d8d60318361473a565b9150613d9882614d79565b604082019050919050565b6000613db0601e8361473a565b9150613dbb82614dc8565b602082019050919050565b6000613dd360398361473a565b9150613dde82614df1565b604082019050919050565b6000613df660188361473a565b9150613e0182614e40565b602082019050919050565b6000613e19602b8361473a565b9150613e2482614e69565b604082019050919050565b6000613e3c60128361473a565b9150613e4782614eb8565b602082019050919050565b6000613e5f60268361473a565b9150613e6a82614ee1565b604082019050919050565b6000613e8260208361473a565b9150613e8d82614f30565b602082019050919050565b6000613ea5602f8361473a565b9150613eb082614f59565b604082019050919050565b6000613ec8601a8361473a565b9150613ed382614fa8565b602082019050919050565b6000613eeb60328361473a565b9150613ef682614fd1565b604082019050919050565b6000613f0e601d8361473a565b9150613f1982615020565b602082019050919050565b6000613f3160228361473a565b9150613f3c82615049565b604082019050919050565b6000613f5460008361472f565b9150613f5f82615098565b600082019050919050565b6000613f7760108361473a565b9150613f828261509b565b602082019050919050565b6000613f9a60338361473a565b9150613fa5826150c4565b604082019050919050565b6000613fbd60168361473a565b9150613fc882615113565b602082019050919050565b6000613fe0601d8361473a565b9150613feb8261513c565b602082019050919050565b600061400360218361473a565b915061400e82615165565b604082019050919050565b600061402660168361473a565b9150614031826151b4565b602082019050919050565b6000614049602e8361473a565b9150614054826151dd565b604082019050919050565b600061406c60268361473a565b91506140778261522c565b604082019050919050565b600061408f601f8361473a565b915061409a8261527b565b602082019050919050565b60006140b2602f8361473a565b91506140bd826152a4565b604082019050919050565b60006140d5602d8361473a565b91506140e0826152f3565b604082019050919050565b60006140f860228361473a565b915061410382615342565b604082019050919050565b6040820160008201516141246000850182613bde565b506020820151614137602085018261414c565b50505050565b6141468161496b565b82525050565b61415581614975565b82525050565b61416481614975565b82525050565b60006141768285613c7d565b91506141828284613c7d565b91508190509392505050565b600061419982613f47565b9150819050919050565b60006020820190506141b86000830184613bed565b92915050565b60006080820190506141d36000830187613bed565b6141e06020830186613bed565b6141ed604083018561413d565b81810360608301526141ff8184613c0b565b905095945050505050565b600060208201905061421f6000830184613bfc565b92915050565b6000602082019050818103600083015261423f8184613c44565b905092915050565b6000602082019050818103600083015261426081613cae565b9050919050565b6000602082019050818103600083015261428081613cd1565b9050919050565b600060208201905081810360008301526142a081613cf4565b9050919050565b600060208201905081810360008301526142c081613d17565b9050919050565b600060208201905081810360008301526142e081613d3a565b9050919050565b6000602082019050818103600083015261430081613d5d565b9050919050565b6000602082019050818103600083015261432081613d80565b9050919050565b6000602082019050818103600083015261434081613da3565b9050919050565b6000602082019050818103600083015261436081613dc6565b9050919050565b6000602082019050818103600083015261438081613de9565b9050919050565b600060208201905081810360008301526143a081613e0c565b9050919050565b600060208201905081810360008301526143c081613e2f565b9050919050565b600060208201905081810360008301526143e081613e52565b9050919050565b6000602082019050818103600083015261440081613e75565b9050919050565b6000602082019050818103600083015261442081613e98565b9050919050565b6000602082019050818103600083015261444081613ebb565b9050919050565b6000602082019050818103600083015261446081613ede565b9050919050565b6000602082019050818103600083015261448081613f01565b9050919050565b600060208201905081810360008301526144a081613f24565b9050919050565b600060208201905081810360008301526144c081613f6a565b9050919050565b600060208201905081810360008301526144e081613f8d565b9050919050565b6000602082019050818103600083015261450081613fb0565b9050919050565b6000602082019050818103600083015261452081613fd3565b9050919050565b6000602082019050818103600083015261454081613ff6565b9050919050565b6000602082019050818103600083015261456081614019565b9050919050565b600060208201905081810360008301526145808161403c565b9050919050565b600060208201905081810360008301526145a08161405f565b9050919050565b600060208201905081810360008301526145c081614082565b9050919050565b600060208201905081810360008301526145e0816140a5565b9050919050565b60006020820190508181036000830152614600816140c8565b9050919050565b60006020820190508181036000830152614620816140eb565b9050919050565b600060408201905061463c600083018461410e565b92915050565b6000602082019050614657600083018461413d565b92915050565b6000604082019050614672600083018561415b565b61467f6020830184613bfc565b9392505050565b60006146906146a1565b905061469c8282614a27565b919050565b6000604051905090565b600067ffffffffffffffff8211156146c6576146c5614b5f565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156146f2576146f1614b5f565b5b6146fb82614b8e565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006147618261492f565b915061476c8361492f565b9250826fffffffffffffffffffffffffffffffff0382111561479157614790614ad2565b5b828201905092915050565b60006147a78261496b565b91506147b28361496b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156147e7576147e6614ad2565b5b828201905092915050565b60006147fd8261496b565b91506148088361496b565b92508261481857614817614b01565b5b828204905092915050565b600061482e8261496b565b91506148398361496b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561487257614871614ad2565b5b828202905092915050565b60006148888261492f565b91506148938361492f565b9250828210156148a6576148a5614ad2565b5b828203905092915050565b60006148bc8261496b565b91506148c78361496b565b9250828210156148da576148d9614ad2565b5b828203905092915050565b60006148f08261494b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b838110156149b657808201518184015260208101905061499b565b838111156149c5576000848401525b50505050565b60006149d68261496b565b915060008214156149ea576149e9614ad2565b5b600182039050919050565b60006002820490506001821680614a0d57607f821691505b60208210811415614a2157614a20614b30565b5b50919050565b614a3082614b8e565b810181811067ffffffffffffffff82111715614a4f57614a4e614b5f565b5b80604052505050565b6000614a638261496b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614a9657614a95614ad2565b5b600182019050919050565b6000614aac8261496b565b9150614ab78361496b565b925082614ac757614ac6614b01565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f63616e206f6e6c79206d696e742061206d756c7469706c65206f66207468652060008201527f6d6178426174636853697a650000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f7175616e74697479206d757374206265206e6f6e7a65726f0000000000000000600082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f7075626c69632073616c6520686173206e6f7420626567756e20796574000000600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f63616e206e6f74206d696e742074686973206d616e7900000000000000000000600082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360008201527f6c65616e75700000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b61539a816148e5565b81146153a557600080fd5b50565b6153b1816148f7565b81146153bc57600080fd5b50565b6153c881614903565b81146153d357600080fd5b50565b6153df8161496b565b81146153ea57600080fd5b5056fea264697066735822122097a138284e3ecbf0dd30f6226eb1c65bc82d9098866bff7b2cdfdb1bdd855df864736f6c634300080400330000000000000000000000000000000000000000000000000000000000000002
Deployed Bytecode
0x6080604052600436106102045760003560e01c8063715018a611610118578063a9aad58c116100a0578063c87b56dd1161006f578063c87b56dd14610745578063d7224ba014610782578063dc33e681146107ad578063e985e9c5146107ea578063f2fde38b1461082757610204565b8063a9aad58c146106b1578063ac446002146106dc578063b0551ac4146106f3578063b88d4fde1461071c57610204565b80638da5cb5b116100e75780638da5cb5b146105c957806390aa0b0f146105f45780639231ab2a1461062057806395d89b411461065d578063a22cb4651461068857610204565b8063715018a6146105335780638bc35c2f1461054a5780638d859f3e146105755780638d92becd146105a057610204565b80632db115441161019b5780634f6ccce71161016a5780634f6ccce71461042a57806355f804b3146104675780636352211e1461049057806366a44155146104cd57806370a08231146104f657610204565b80632db115441461037f5780632f745c591461039b578063375a069a146103d857806342842e0e1461040157610204565b806310b0c052116101d757806310b0c052146102d757806318160ddd1461030257806323b872dd1461032d5780632d20fb601461035657610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190613b1e565b610850565b60405161023d919061420a565b60405180910390f35b34801561025257600080fd5b5061025b61099a565b6040516102689190614225565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190613bb5565b610a2c565b6040516102a591906141a3565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d09190613a65565b610ab1565b005b3480156102e357600080fd5b506102ec610bca565b6040516102f99190614642565b60405180910390f35b34801561030e57600080fd5b50610317610bd0565b6040516103249190614642565b60405180910390f35b34801561033957600080fd5b50610354600480360381019061034f919061395f565b610bda565b005b34801561036257600080fd5b5061037d60048036038101906103789190613bb5565b610bea565b005b61039960048036038101906103949190613bb5565b610cc8565b005b3480156103a757600080fd5b506103c260048036038101906103bd9190613a65565b610f5d565b6040516103cf9190614642565b60405180910390f35b3480156103e457600080fd5b506103ff60048036038101906103fa9190613bb5565b61115b565b005b34801561040d57600080fd5b506104286004803603810190610423919061395f565b611337565b005b34801561043657600080fd5b50610451600480360381019061044c9190613bb5565b611357565b60405161045e9190614642565b60405180910390f35b34801561047357600080fd5b5061048e60048036038101906104899190613b70565b6113aa565b005b34801561049c57600080fd5b506104b760048036038101906104b29190613bb5565b61143c565b6040516104c491906141a3565b60405180910390f35b3480156104d957600080fd5b506104f460048036038101906104ef9190613aa1565b611452565b005b34801561050257600080fd5b5061051d600480360381019061051891906138fa565b6115b1565b60405161052a9190614642565b60405180910390f35b34801561053f57600080fd5b5061054861169a565b005b34801561055657600080fd5b5061055f611722565b60405161056c9190614642565b60405180910390f35b34801561058157600080fd5b5061058a611746565b6040516105979190614642565b60405180910390f35b3480156105ac57600080fd5b506105c760048036038101906105c29190613af5565b61174c565b005b3480156105d557600080fd5b506105de6117e5565b6040516105eb91906141a3565b60405180910390f35b34801561060057600080fd5b5061060961180e565b60405161061792919061465d565b60405180910390f35b34801561062c57600080fd5b5061064760048036038101906106429190613bb5565b611841565b6040516106549190614627565b60405180910390f35b34801561066957600080fd5b50610672611859565b60405161067f9190614225565b60405180910390f35b34801561069457600080fd5b506106af60048036038101906106aa9190613a29565b6118eb565b005b3480156106bd57600080fd5b506106c6611a6c565b6040516106d3919061420a565b60405180910390f35b3480156106e857600080fd5b506106f1611a7f565b005b3480156106ff57600080fd5b5061071a60048036038101906107159190613bb5565b611c00565b005b34801561072857600080fd5b50610743600480360381019061073e91906139ae565b611c86565b005b34801561075157600080fd5b5061076c60048036038101906107679190613bb5565b611ce2565b6040516107799190614225565b60405180910390f35b34801561078e57600080fd5b50610797611d89565b6040516107a49190614642565b60405180910390f35b3480156107b957600080fd5b506107d460048036038101906107cf91906138fa565b611d8f565b6040516107e19190614642565b60405180910390f35b3480156107f657600080fd5b50610811600480360381019061080c9190613923565b611da1565b60405161081e919061420a565b60405180910390f35b34801561083357600080fd5b5061084e600480360381019061084991906138fa565b611e35565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061091b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061098357507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610993575061099282611f2d565b5b9050919050565b6060600280546109a9906149f5565b80601f01602080910402602001604051908101604052809291908181526020018280546109d5906149f5565b8015610a225780601f106109f757610100808354040283529160200191610a22565b820191906000526020600020905b815481529060010190602001808311610a0557829003601f168201915b5050505050905090565b6000610a3782611f97565b610a76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6d906145e7565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610abc8261143c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2490614487565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b4c611fa5565b73ffffffffffffffffffffffffffffffffffffffff161480610b7b5750610b7a81610b75611fa5565b611da1565b5b610bba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb190614347565b60405180910390fd5b610bc5838383611fad565b505050565b600a5481565b6000600154905090565b610be583838361205f565b505050565b610bf2611fa5565b73ffffffffffffffffffffffffffffffffffffffff16610c106117e5565b73ffffffffffffffffffffffffffffffffffffffff1614610c66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5d906143e7565b60405180910390fd5b60026009541415610cac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca3906145a7565b60405180910390fd5b6002600981905550610cbd81612618565b600160098190555050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90614327565b60405180910390fd5b6000600b60009054906101000a900460ff1690506000600c549050610d5b81836128a6565b610d9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9190614467565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000001483610dc533611d8f565b610dcf919061479c565b1115610e10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0790614547565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000001b3983610e3a610bd0565b610e44919061479c565b1115610e85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7c906143a7565b60405180910390fd5b60008382610e939190614823565b90506000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600a54610ee491906148b1565b90506000811115610f4357808510610f1e578281610f029190614823565b82610f0d91906148b1565b9150610f1933826128be565b610f42565b8285610f2a9190614823565b82610f3591906148b1565b9150610f4133866128be565b5b5b610f4d3386612918565b610f5682612936565b5050505050565b6000610f68836115b1565b8210610fa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa090614247565b60405180910390fd5b6000610fb3610bd0565b905060008060005b83811015611119576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146110ad57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561110557868414156110f6578195505050505050611155565b838061110190614a58565b9450505b50808061111190614a58565b915050610fbb565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114c90614567565b60405180910390fd5b92915050565b611163611fa5565b73ffffffffffffffffffffffffffffffffffffffff166111816117e5565b73ffffffffffffffffffffffffffffffffffffffff16146111d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ce906143e7565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000001b3981611201610bd0565b61120b919061479c565b111561124c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611243906143a7565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000148261127a9190614aa1565b146112ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b1906142a7565b60405180910390fd5b60007f0000000000000000000000000000000000000000000000000000000000000014826112e891906147f2565b905060005b818110156113325761131f337f0000000000000000000000000000000000000000000000000000000000000014612918565b808061132a90614a58565b9150506112ed565b505050565b61135283838360405180602001604052806000815250611c86565b505050565b6000611361610bd0565b82106113a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611399906142c7565b60405180910390fd5b819050919050565b6113b2611fa5565b73ffffffffffffffffffffffffffffffffffffffff166113d06117e5565b73ffffffffffffffffffffffffffffffffffffffff1614611426576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141d906143e7565b60405180910390fd5b8181600f919061143792919061366c565b505050565b6000611447826129d7565b600001519050919050565b61145a611fa5565b73ffffffffffffffffffffffffffffffffffffffff166114786117e5565b73ffffffffffffffffffffffffffffffffffffffff16146114ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c5906143e7565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000001b39816114f8610bd0565b611502919061479c565b1115611543576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153a906143a7565b60405180910390fd5b60005b82518110156115ac5761159983828151811061158b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015183612918565b80806115a490614a58565b915050611546565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611622576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161990614387565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6116a2611fa5565b73ffffffffffffffffffffffffffffffffffffffff166116c06117e5565b73ffffffffffffffffffffffffffffffffffffffff1614611716576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170d906143e7565b60405180910390fd5b6117206000612bda565b565b7f000000000000000000000000000000000000000000000000000000000000001481565b600c5481565b611754611fa5565b73ffffffffffffffffffffffffffffffffffffffff166117726117e5565b73ffffffffffffffffffffffffffffffffffffffff16146117c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bf906143e7565b60405180910390fd5b80600b60006101000a81548160ff02191690831515021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e8060000160009054906101000a900467ffffffffffffffff16908060000160089054906101000a900460ff16905082565b6118496136f2565b611852826129d7565b9050919050565b606060038054611868906149f5565b80601f0160208091040260200160405190810160405280929190818152602001828054611894906149f5565b80156118e15780601f106118b6576101008083540402835291602001916118e1565b820191906000526020600020905b8154815290600101906020018083116118c457829003601f168201915b5050505050905090565b6118f3611fa5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611961576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195890614427565b60405180910390fd5b806007600061196e611fa5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a1b611fa5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a60919061420a565b60405180910390a35050565b600b60009054906101000a900460ff1681565b611a87611fa5565b73ffffffffffffffffffffffffffffffffffffffff16611aa56117e5565b73ffffffffffffffffffffffffffffffffffffffff1614611afb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af2906143e7565b60405180910390fd5b60026009541415611b41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b38906145a7565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051611b6f9061418e565b60006040518083038185875af1925050503d8060008114611bac576040519150601f19603f3d011682016040523d82523d6000602084013e611bb1565b606091505b5050905080611bf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bec906144a7565b60405180910390fd5b506001600981905550565b611c08611fa5565b73ffffffffffffffffffffffffffffffffffffffff16611c266117e5565b73ffffffffffffffffffffffffffffffffffffffff1614611c7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c73906143e7565b60405180910390fd5b80600a8190555050565b611c9184848461205f565b611c9d84848484612c9e565b611cdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd3906144c7565b60405180910390fd5b50505050565b6060611ced82611f97565b611d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2390614407565b60405180910390fd5b6000611d36612e35565b90506000815111611d565760405180602001604052806000815250611d81565b80611d6084612ec7565b604051602001611d7192919061416a565b6040516020818303038152906040525b915050919050565b60085481565b6000611d9a82613074565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611e3d611fa5565b73ffffffffffffffffffffffffffffffffffffffff16611e5b6117e5565b73ffffffffffffffffffffffffffffffffffffffff1614611eb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea8906143e7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1890614267565b60405180910390fd5b611f2a81612bda565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600060015482109050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061206a826129d7565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16612091611fa5565b73ffffffffffffffffffffffffffffffffffffffff1614806120ed57506120b6611fa5565b73ffffffffffffffffffffffffffffffffffffffff166120d584610a2c565b73ffffffffffffffffffffffffffffffffffffffff16145b8061210957506121088260000151612103611fa5565b611da1565b5b90508061214b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214290614447565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146121bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b4906143c7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561222d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612224906142e7565b60405180910390fd5b61223a858585600161315d565b61224a6000848460000151611fad565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166122b8919061487d565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff1661235c9190614756565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184612462919061479c565b9050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156125a8576124d881611f97565b156125a7576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506004600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126108686866001613163565b505050505050565b6000600854905060008211612662576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265990614367565b60405180910390fd5b600060018383612672919061479c565b61267c91906148b1565b905060017f0000000000000000000000000000000000000000000000000000000000001b396126ab91906148b1565b8111156126e25760017f0000000000000000000000000000000000000000000000000000000000001b396126df91906148b1565b90505b6126eb81611f97565b61272a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272190614587565b60405180910390fd5b60008290505b81811161288d57600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561287a5760006127ad826129d7565b90506040518060400160405280826000015173ffffffffffffffffffffffffffffffffffffffff168152602001826020015167ffffffffffffffff168152506004600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050505b808061288590614a58565b915050612730565b5060018161289b919061479c565b600881905550505050565b60008083141580156128b6575081155b905092915050565b80600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461290d919061479c565b925050819055505050565b612932828260405180602001604052806000815250613169565b5050565b80341015612979576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612970906144e7565b60405180910390fd5b803411156129d4573373ffffffffffffffffffffffffffffffffffffffff166108fc82346129a791906148b1565b9081150290604051600060405180830381858888f193505050501580156129d2573d6000803e3d6000fd5b505b50565b6129df6136f2565b6129e882611f97565b612a27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1e90614287565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000148310612a8b5760017f000000000000000000000000000000000000000000000000000000000000001484612a7e91906148b1565b612a88919061479c565b90505b60008390505b818110612b99576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612b8557809350505050612bd5565b508080612b91906149cb565b915050612a91565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bcc906145c7565b60405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612cbf8473ffffffffffffffffffffffffffffffffffffffff16613649565b15612e28578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ce8611fa5565b8786866040518563ffffffff1660e01b8152600401612d0a94939291906141be565b602060405180830381600087803b158015612d2457600080fd5b505af1925050508015612d5557506040513d601f19601f82011682018060405250810190612d529190613b47565b60015b612dd8573d8060008114612d85576040519150601f19603f3d011682016040523d82523d6000602084013e612d8a565b606091505b50600081511415612dd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc7906144c7565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e2d565b600190505b949350505050565b6060600f8054612e44906149f5565b80601f0160208091040260200160405190810160405280929190818152602001828054612e70906149f5565b8015612ebd5780601f10612e9257610100808354040283529160200191612ebd565b820191906000526020600020905b815481529060010190602001808311612ea057829003601f168201915b5050505050905090565b60606000821415612f0f576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061306f565b600082905060005b60008214612f41578080612f2a90614a58565b915050600a82612f3a91906147f2565b9150612f17565b60008167ffffffffffffffff811115612f83577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612fb55781602001600182028036833780820191505090505b5090505b6000851461306857600182612fce91906148b1565b9150600a85612fdd9190614aa1565b6030612fe9919061479c565b60f81b818381518110613025577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561306191906147f2565b9450612fb9565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130dc90614307565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b50505050565b50505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156131e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131d790614527565b60405180910390fd5b6131e981611f97565b15613229576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161322090614507565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000001483111561328c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161328390614607565b60405180910390fd5b613299600085838661315d565b6000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681525050905060405180604001604052808583600001516133969190614756565b6fffffffffffffffffffffffffffffffff1681526020018583602001516133bd9190614756565b6fffffffffffffffffffffffffffffffff16815250600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561362c57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46135cc6000888488612c9e565b61360b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613602906144c7565b60405180910390fd5b818061361690614a58565b925050808061362490614a58565b91505061355b565b50806001819055506136416000878588613163565b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054613678906149f5565b90600052602060002090601f01602090048101928261369a57600085556136e1565b82601f106136b357803560ff19168380011785556136e1565b828001600101855582156136e1579182015b828111156136e05782358255916020019190600101906136c5565b5b5090506136ee919061372c565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b8082111561374557600081600090555060010161372d565b5090565b600061375c613757846146ab565b614686565b9050808382526020820190508285602086028201111561377b57600080fd5b60005b858110156137ab578161379188826137f3565b84526020840193506020830192505060018101905061377e565b5050509392505050565b60006137c86137c3846146d7565b614686565b9050828152602081018484840111156137e057600080fd5b6137eb848285614989565b509392505050565b60008135905061380281615391565b92915050565b600082601f83011261381957600080fd5b8135613829848260208601613749565b91505092915050565b600081359050613841816153a8565b92915050565b600081359050613856816153bf565b92915050565b60008151905061386b816153bf565b92915050565b600082601f83011261388257600080fd5b81356138928482602086016137b5565b91505092915050565b60008083601f8401126138ad57600080fd5b8235905067ffffffffffffffff8111156138c657600080fd5b6020830191508360018202830111156138de57600080fd5b9250929050565b6000813590506138f4816153d6565b92915050565b60006020828403121561390c57600080fd5b600061391a848285016137f3565b91505092915050565b6000806040838503121561393657600080fd5b6000613944858286016137f3565b9250506020613955858286016137f3565b9150509250929050565b60008060006060848603121561397457600080fd5b6000613982868287016137f3565b9350506020613993868287016137f3565b92505060406139a4868287016138e5565b9150509250925092565b600080600080608085870312156139c457600080fd5b60006139d2878288016137f3565b94505060206139e3878288016137f3565b93505060406139f4878288016138e5565b925050606085013567ffffffffffffffff811115613a1157600080fd5b613a1d87828801613871565b91505092959194509250565b60008060408385031215613a3c57600080fd5b6000613a4a858286016137f3565b9250506020613a5b85828601613832565b9150509250929050565b60008060408385031215613a7857600080fd5b6000613a86858286016137f3565b9250506020613a97858286016138e5565b9150509250929050565b60008060408385031215613ab457600080fd5b600083013567ffffffffffffffff811115613ace57600080fd5b613ada85828601613808565b9250506020613aeb858286016138e5565b9150509250929050565b600060208284031215613b0757600080fd5b6000613b1584828501613832565b91505092915050565b600060208284031215613b3057600080fd5b6000613b3e84828501613847565b91505092915050565b600060208284031215613b5957600080fd5b6000613b678482850161385c565b91505092915050565b60008060208385031215613b8357600080fd5b600083013567ffffffffffffffff811115613b9d57600080fd5b613ba98582860161389b565b92509250509250929050565b600060208284031215613bc757600080fd5b6000613bd5848285016138e5565b91505092915050565b613be7816148e5565b82525050565b613bf6816148e5565b82525050565b613c05816148f7565b82525050565b6000613c1682614708565b613c20818561471e565b9350613c30818560208601614998565b613c3981614b8e565b840191505092915050565b6000613c4f82614713565b613c59818561473a565b9350613c69818560208601614998565b613c7281614b8e565b840191505092915050565b6000613c8882614713565b613c92818561474b565b9350613ca2818560208601614998565b80840191505092915050565b6000613cbb60228361473a565b9150613cc682614b9f565b604082019050919050565b6000613cde60268361473a565b9150613ce982614bee565b604082019050919050565b6000613d01602a8361473a565b9150613d0c82614c3d565b604082019050919050565b6000613d24602c8361473a565b9150613d2f82614c8c565b604082019050919050565b6000613d4760238361473a565b9150613d5282614cdb565b604082019050919050565b6000613d6a60258361473a565b9150613d7582614d2a565b604082019050919050565b6000613d8d60318361473a565b9150613d9882614d79565b604082019050919050565b6000613db0601e8361473a565b9150613dbb82614dc8565b602082019050919050565b6000613dd360398361473a565b9150613dde82614df1565b604082019050919050565b6000613df660188361473a565b9150613e0182614e40565b602082019050919050565b6000613e19602b8361473a565b9150613e2482614e69565b604082019050919050565b6000613e3c60128361473a565b9150613e4782614eb8565b602082019050919050565b6000613e5f60268361473a565b9150613e6a82614ee1565b604082019050919050565b6000613e8260208361473a565b9150613e8d82614f30565b602082019050919050565b6000613ea5602f8361473a565b9150613eb082614f59565b604082019050919050565b6000613ec8601a8361473a565b9150613ed382614fa8565b602082019050919050565b6000613eeb60328361473a565b9150613ef682614fd1565b604082019050919050565b6000613f0e601d8361473a565b9150613f1982615020565b602082019050919050565b6000613f3160228361473a565b9150613f3c82615049565b604082019050919050565b6000613f5460008361472f565b9150613f5f82615098565b600082019050919050565b6000613f7760108361473a565b9150613f828261509b565b602082019050919050565b6000613f9a60338361473a565b9150613fa5826150c4565b604082019050919050565b6000613fbd60168361473a565b9150613fc882615113565b602082019050919050565b6000613fe0601d8361473a565b9150613feb8261513c565b602082019050919050565b600061400360218361473a565b915061400e82615165565b604082019050919050565b600061402660168361473a565b9150614031826151b4565b602082019050919050565b6000614049602e8361473a565b9150614054826151dd565b604082019050919050565b600061406c60268361473a565b91506140778261522c565b604082019050919050565b600061408f601f8361473a565b915061409a8261527b565b602082019050919050565b60006140b2602f8361473a565b91506140bd826152a4565b604082019050919050565b60006140d5602d8361473a565b91506140e0826152f3565b604082019050919050565b60006140f860228361473a565b915061410382615342565b604082019050919050565b6040820160008201516141246000850182613bde565b506020820151614137602085018261414c565b50505050565b6141468161496b565b82525050565b61415581614975565b82525050565b61416481614975565b82525050565b60006141768285613c7d565b91506141828284613c7d565b91508190509392505050565b600061419982613f47565b9150819050919050565b60006020820190506141b86000830184613bed565b92915050565b60006080820190506141d36000830187613bed565b6141e06020830186613bed565b6141ed604083018561413d565b81810360608301526141ff8184613c0b565b905095945050505050565b600060208201905061421f6000830184613bfc565b92915050565b6000602082019050818103600083015261423f8184613c44565b905092915050565b6000602082019050818103600083015261426081613cae565b9050919050565b6000602082019050818103600083015261428081613cd1565b9050919050565b600060208201905081810360008301526142a081613cf4565b9050919050565b600060208201905081810360008301526142c081613d17565b9050919050565b600060208201905081810360008301526142e081613d3a565b9050919050565b6000602082019050818103600083015261430081613d5d565b9050919050565b6000602082019050818103600083015261432081613d80565b9050919050565b6000602082019050818103600083015261434081613da3565b9050919050565b6000602082019050818103600083015261436081613dc6565b9050919050565b6000602082019050818103600083015261438081613de9565b9050919050565b600060208201905081810360008301526143a081613e0c565b9050919050565b600060208201905081810360008301526143c081613e2f565b9050919050565b600060208201905081810360008301526143e081613e52565b9050919050565b6000602082019050818103600083015261440081613e75565b9050919050565b6000602082019050818103600083015261442081613e98565b9050919050565b6000602082019050818103600083015261444081613ebb565b9050919050565b6000602082019050818103600083015261446081613ede565b9050919050565b6000602082019050818103600083015261448081613f01565b9050919050565b600060208201905081810360008301526144a081613f24565b9050919050565b600060208201905081810360008301526144c081613f6a565b9050919050565b600060208201905081810360008301526144e081613f8d565b9050919050565b6000602082019050818103600083015261450081613fb0565b9050919050565b6000602082019050818103600083015261452081613fd3565b9050919050565b6000602082019050818103600083015261454081613ff6565b9050919050565b6000602082019050818103600083015261456081614019565b9050919050565b600060208201905081810360008301526145808161403c565b9050919050565b600060208201905081810360008301526145a08161405f565b9050919050565b600060208201905081810360008301526145c081614082565b9050919050565b600060208201905081810360008301526145e0816140a5565b9050919050565b60006020820190508181036000830152614600816140c8565b9050919050565b60006020820190508181036000830152614620816140eb565b9050919050565b600060408201905061463c600083018461410e565b92915050565b6000602082019050614657600083018461413d565b92915050565b6000604082019050614672600083018561415b565b61467f6020830184613bfc565b9392505050565b60006146906146a1565b905061469c8282614a27565b919050565b6000604051905090565b600067ffffffffffffffff8211156146c6576146c5614b5f565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156146f2576146f1614b5f565b5b6146fb82614b8e565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006147618261492f565b915061476c8361492f565b9250826fffffffffffffffffffffffffffffffff0382111561479157614790614ad2565b5b828201905092915050565b60006147a78261496b565b91506147b28361496b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156147e7576147e6614ad2565b5b828201905092915050565b60006147fd8261496b565b91506148088361496b565b92508261481857614817614b01565b5b828204905092915050565b600061482e8261496b565b91506148398361496b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561487257614871614ad2565b5b828202905092915050565b60006148888261492f565b91506148938361492f565b9250828210156148a6576148a5614ad2565b5b828203905092915050565b60006148bc8261496b565b91506148c78361496b565b9250828210156148da576148d9614ad2565b5b828203905092915050565b60006148f08261494b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b82818337600083830152505050565b60005b838110156149b657808201518184015260208101905061499b565b838111156149c5576000848401525b50505050565b60006149d68261496b565b915060008214156149ea576149e9614ad2565b5b600182039050919050565b60006002820490506001821680614a0d57607f821691505b60208210811415614a2157614a20614b30565b5b50919050565b614a3082614b8e565b810181811067ffffffffffffffff82111715614a4f57614a4e614b5f565b5b80604052505050565b6000614a638261496b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614a9657614a95614ad2565b5b600182019050919050565b6000614aac8261496b565b9150614ab78361496b565b925082614ac757614ac6614b01565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f63616e206f6e6c79206d696e742061206d756c7469706c65206f66207468652060008201527f6d6178426174636853697a650000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f7175616e74697479206d757374206265206e6f6e7a65726f0000000000000000600082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f72656163686564206d617820737570706c790000000000000000000000000000600082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f7075626c69632073616c6520686173206e6f7420626567756e20796574000000600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f4e65656420746f2073656e64206d6f7265204554482e00000000000000000000600082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f63616e206e6f74206d696e742074686973206d616e7900000000000000000000600082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360008201527f6c65616e75700000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b61539a816148e5565b81146153a557600080fd5b50565b6153b1816148f7565b81146153bc57600080fd5b50565b6153c881614903565b81146153d357600080fd5b50565b6153df8161496b565b81146153ea57600080fd5b5056fea264697066735822122097a138284e3ecbf0dd30f6226eb1c65bc82d9098866bff7b2cdfdb1bdd855df864736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000002
-----Decoded View---------------
Arg [0] : freeMintAllowance (uint256): 2
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000002
Deployed Bytecode Sourcemap
42709:4044:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27801:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29527:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31052:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30615:379;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42826:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26362:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31902:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46366:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43699:1003;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26993:744;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45493:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32107:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26525:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46073:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29350:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43418:275;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28227:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41816:103;;;;;;;;;;;;;:::i;:::-;;42773:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42902:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44918:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41165:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43075:28;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;46603:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29682:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31320:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42872:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46179:181;;;;;;;;;;;;;:::i;:::-;;45194:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32327:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29843:394;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36742:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46490:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31657:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42074:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27801:370;27928:4;27973:25;27958:40;;;:11;:40;;;;:99;;;;28024:33;28009:48;;;:11;:48;;;;27958:99;:160;;;;28083:35;28068:50;;;:11;:50;;;;27958:160;:207;;;;28129:36;28153:11;28129:23;:36::i;:::-;27958:207;27944:221;;27801:370;;;:::o;29527:94::-;29581:13;29610:5;29603:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29527:94;:::o;31052:204::-;31120:7;31144:16;31152:7;31144;:16::i;:::-;31136:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;31226:15;:24;31242:7;31226:24;;;;;;;;;;;;;;;;;;;;;31219:31;;31052:204;;;:::o;30615:379::-;30684:13;30700:24;30716:7;30700:15;:24::i;:::-;30684:40;;30745:5;30739:11;;:2;:11;;;;30731:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30830:5;30814:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;30839:37;30856:5;30863:12;:10;:12::i;:::-;30839:16;:37::i;:::-;30814:62;30798:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;30960:28;30969:2;30973:7;30982:5;30960:8;:28::i;:::-;30615:379;;;:::o;42826:41::-;;;;:::o;26362:94::-;26415:7;26438:12;;26431:19;;26362:94;:::o;31902:142::-;32010:28;32020:4;32026:2;32030:7;32010:9;:28::i;:::-;31902:142;;;:::o;46366:118::-;41396:12;:10;:12::i;:::-;41385:23;;:7;:5;:7::i;:::-;:23;;;41377:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22206:1:::1;22804:7;;:19;;22796:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;22206:1;22937:7;:18;;;;46450:28:::2;46469:8;46450:18;:28::i;:::-;22162:1:::1;23116:7;:22;;;;46366:118:::0;:::o;43699:1003::-;43353:10;43340:23;;:9;:23;;;43332:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;43792:10:::1;43805:6;;;;;;;;;;;43792:19;;43818;43840:5;;43818:27;;43870:34;43885:11;43898:5;43870:14;:34::i;:::-;43854:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;44013:23;44001:8;43974:24;43987:10;43974:12;:24::i;:::-;:35;;;;:::i;:::-;:62;;43958:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;44119:14;44107:8;44091:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:42;;44083:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;44165:13;44195:8;44181:11;:22;;;;:::i;:::-;44165:38;;44212:25;44286:16;:28;44303:10;44286:28;;;;;;;;;;;;;;;;44240:26;;:74;;;;:::i;:::-;44212:102;;44345:1;44325:17;:21;44321:310;;;44373:17;44361:8;:29;44357:267;;44432:11;44412:17;:31;;;;:::i;:::-;44403:40;;;;;:::i;:::-;;;44454:50;44474:10;44486:17;44454:19;:50::i;:::-;44357:267;;;44551:11;44540:8;:22;;;;:::i;:::-;44531:31;;;;;:::i;:::-;;;44573:41;44593:10;44605:8;44573:19;:41::i;:::-;44357:267;44321:310;44639:31;44649:10;44661:8;44639:9;:31::i;:::-;44677:19;44690:5;44677:12;:19::i;:::-;43405:1;;;;43699:1003:::0;:::o;26993:744::-;27102:7;27137:16;27147:5;27137:9;:16::i;:::-;27129:5;:24;27121:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;27199:22;27224:13;:11;:13::i;:::-;27199:38;;27244:19;27274:25;27324:9;27319:350;27343:14;27339:1;:18;27319:350;;;27373:31;27407:11;:14;27419:1;27407:14;;;;;;;;;;;27373:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27460:1;27434:28;;:9;:14;;;:28;;;27430:89;;27495:9;:14;;;27475:34;;27430:89;27552:5;27531:26;;:17;:26;;;27527:135;;;27589:5;27574:11;:20;27570:59;;;27616:1;27609:8;;;;;;;;;27570:59;27639:13;;;;;:::i;:::-;;;;27527:135;27319:350;27359:3;;;;;:::i;:::-;;;;27319:350;;;;27675:56;;;;;;;;;;:::i;:::-;;;;;;;;26993:744;;;;;:::o;45493:401::-;41396:12;:10;:12::i;:::-;41385:23;;:7;:5;:7::i;:::-;:23;;;41377:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45590:14:::1;45578:8;45562:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:42;;45554:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;45677:1;45661:12;45650:8;:23;;;;:::i;:::-;:28;45634:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;45747:17;45778:12;45767:8;:23;;;;:::i;:::-;45747:43;;45802:9;45797:92;45821:9;45817:1;:13;45797:92;;;45846:35;45856:10;45868:12;45846:9;:35::i;:::-;45832:3;;;;;:::i;:::-;;;;45797:92;;;;41456:1;45493:401:::0;:::o;32107:157::-;32219:39;32236:4;32242:2;32246:7;32219:39;;;;;;;;;;;;:16;:39::i;:::-;32107:157;;;:::o;26525:177::-;26592:7;26624:13;:11;:13::i;:::-;26616:5;:21;26608:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;26691:5;26684:12;;26525:177;;;:::o;46073:100::-;41396:12;:10;:12::i;:::-;41385:23;;:7;:5;:7::i;:::-;:23;;;41377:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46160:7:::1;;46144:13;:23;;;;;;;:::i;:::-;;46073:100:::0;;:::o;29350:118::-;29414:7;29437:20;29449:7;29437:11;:20::i;:::-;:25;;;29430:32;;29350:118;;;:::o;43418:275::-;41396:12;:10;:12::i;:::-;41385:23;;:7;:5;:7::i;:::-;:23;;;41377:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43547:14:::1;43535:8;43519:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:42;;43511:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;43596:9;43591:97;43615:9;:16;43611:1;:20;43591:97;;;43647:33;43657:9;43667:1;43657:12;;;;;;;;;;;;;;;;;;;;;;43671:8;43647:9;:33::i;:::-;43633:3;;;;;:::i;:::-;;;;43591:97;;;;43418:275:::0;;:::o;28227:211::-;28291:7;28332:1;28315:19;;:5;:19;;;;28307:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;28404:12;:19;28417:5;28404:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;28396:36;;28389:43;;28227:211;;;:::o;41816:103::-;41396:12;:10;:12::i;:::-;41385:23;;:7;:5;:7::i;:::-;:23;;;41377:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41881:30:::1;41908:1;41881:18;:30::i;:::-;41816:103::o:0;42773:48::-;;;:::o;42902:34::-;;;;:::o;44918:97::-;41396:12;:10;:12::i;:::-;41385:23;;:7;:5;:7::i;:::-;:23;;;41377:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44997:12:::1;44988:6;;:21;;;;;;;;;;;;;;;;;;44918:97:::0;:::o;41165:87::-;41211:7;41238:6;;;;;;;;;;;41231:13;;41165:87;:::o;43075:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;46603:147::-;46684:21;;:::i;:::-;46724:20;46736:7;46724:11;:20::i;:::-;46717:27;;46603:147;;;:::o;29682:98::-;29738:13;29767:7;29760:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29682:98;:::o;31320:274::-;31423:12;:10;:12::i;:::-;31411:24;;:8;:24;;;;31403:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;31520:8;31475:18;:32;31494:12;:10;:12::i;:::-;31475:32;;;;;;;;;;;;;;;:42;31508:8;31475:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;31569:8;31540:48;;31555:12;:10;:12::i;:::-;31540:48;;;31579:8;31540:48;;;;;;:::i;:::-;;;;;;;;31320:274;;:::o;42872:25::-;;;;;;;;;;;;;:::o;46179:181::-;41396:12;:10;:12::i;:::-;41385:23;;:7;:5;:7::i;:::-;:23;;;41377:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22206:1:::1;22804:7;;:19;;22796:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;22206:1;22937:7;:18;;;;46244:12:::2;46262:10;:15;;46285:21;46262:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46243:68;;;46326:7;46318:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;22968:1;22162::::1;23116:7;:22;;;;46179:181::o:0;45194:148::-;41396:12;:10;:12::i;:::-;41385:23;;:7;:5;:7::i;:::-;:23;;;41377:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45319:17:::1;45290:26;:46;;;;45194:148:::0;:::o;32327:311::-;32464:28;32474:4;32480:2;32484:7;32464:9;:28::i;:::-;32515:48;32538:4;32544:2;32548:7;32557:5;32515:22;:48::i;:::-;32499:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;32327:311;;;;:::o;29843:394::-;29941:13;29982:16;29990:7;29982;:16::i;:::-;29966:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;30072:21;30096:10;:8;:10::i;:::-;30072:34;;30151:1;30133:7;30127:21;:25;:104;;;;;;;;;;;;;;;;;30188:7;30197:18;:7;:16;:18::i;:::-;30171:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;30127:104;30113:118;;;29843:394;;;:::o;36742:43::-;;;;:::o;46490:107::-;46548:7;46571:20;46585:5;46571:13;:20::i;:::-;46564:27;;46490:107;;;:::o;31657:186::-;31779:4;31802:18;:25;31821:5;31802:25;;;;;;;;;;;;;;;:35;31828:8;31802:35;;;;;;;;;;;;;;;;;;;;;;;;;31795:42;;31657:186;;;;:::o;42074:201::-;41396:12;:10;:12::i;:::-;41385:23;;:7;:5;:7::i;:::-;:23;;;41377:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42183:1:::1;42163:22;;:8;:22;;;;42155:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42239:28;42258:8;42239:18;:28::i;:::-;42074:201:::0;:::o;13475:157::-;13560:4;13599:25;13584:40;;;:11;:40;;;;13577:47;;13475:157;;;:::o;32877:105::-;32934:4;32964:12;;32954:7;:22;32947:29;;32877:105;;;:::o;23832:98::-;23885:7;23912:10;23905:17;;23832:98;:::o;36564:172::-;36688:2;36661:15;:24;36677:7;36661:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;36722:7;36718:2;36702:28;;36711:5;36702:28;;;;;;;;;;;;36564:172;;;:::o;34929:1529::-;35026:35;35064:20;35076:7;35064:11;:20::i;:::-;35026:58;;35093:22;35135:13;:18;;;35119:34;;:12;:10;:12::i;:::-;:34;;;:81;;;;35188:12;:10;:12::i;:::-;35164:36;;:20;35176:7;35164:11;:20::i;:::-;:36;;;35119:81;:142;;;;35211:50;35228:13;:18;;;35248:12;:10;:12::i;:::-;35211:16;:50::i;:::-;35119:142;35093:169;;35287:17;35271:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;35419:4;35397:26;;:13;:18;;;:26;;;35381:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;35508:1;35494:16;;:2;:16;;;;35486:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;35561:43;35583:4;35589:2;35593:7;35602:1;35561:21;:43::i;:::-;35661:49;35678:1;35682:7;35691:13;:18;;;35661:8;:49::i;:::-;35749:1;35719:12;:18;35732:4;35719:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;35785:1;35757:12;:16;35770:2;35757:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;35816:43;;;;;;;;35831:2;35816:43;;;;;;35842:15;35816:43;;;;;35793:11;:20;35805:7;35793:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36087:19;36119:1;36109:7;:11;;;;:::i;:::-;36087:33;;36172:1;36131:43;;:11;:24;36143:11;36131:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;36127:236;;;36189:20;36197:11;36189:7;:20::i;:::-;36185:171;;;36249:97;;;;;;;;36276:13;:18;;;36249:97;;;;;;36307:13;:28;;;36249:97;;;;;36222:11;:24;36234:11;36222:24;;;;;;;;;;;:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36185:171;36127:236;36395:7;36391:2;36376:27;;36385:4;36376:27;;;;;;;;;;;;36410:42;36431:4;36437:2;36441:7;36450:1;36410:20;:42::i;:::-;34929:1529;;;;;;:::o;36890:846::-;36952:25;36980:24;;36952:52;;37030:1;37019:8;:12;37011:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;37067:16;37117:1;37106:8;37086:17;:28;;;;:::i;:::-;:32;;;;:::i;:::-;37067:51;;37157:1;37140:14;:18;;;;:::i;:::-;37129:8;:29;37125:81;;;37197:1;37180:14;:18;;;;:::i;:::-;37169:29;;37125:81;37321:17;37329:8;37321:7;:17::i;:::-;37313:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37393:9;37405:17;37393:29;;37388:297;37429:8;37424:1;:13;37388:297;;37488:1;37457:33;;:11;:14;37469:1;37457:14;;;;;;;;;;;:19;;;;;;;;;;;;:33;;;37453:225;;;37503:31;37537:14;37549:1;37537:11;:14::i;:::-;37503:48;;37579:89;;;;;;;;37606:9;:14;;;37579:89;;;;;;37633:9;:24;;;37579:89;;;;;37562:11;:14;37574:1;37562:14;;;;;;;;;;;:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37453:225;;37439:3;;;;;:::i;:::-;;;;37388:297;;;;37729:1;37718:8;:12;;;;:::i;:::-;37691:24;:39;;;;36890:846;;;:::o;45021:167::-;45119:4;45164:1;45146:14;:19;;:36;;;;;45177:5;45176:6;45146:36;45132:50;;45021:167;;;;:::o;45348:114::-;45451:5;45423:16;:24;45440:6;45423:24;;;;;;;;;;;;;;;;:33;;;;;;;:::i;:::-;;;;;;;;45348:114;;:::o;32988:98::-;33053:27;33063:2;33067:8;33053:27;;;;;;;;;;;;:9;:27::i;:::-;32988:98;;:::o;44708:204::-;44781:5;44768:9;:18;;44760:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;44836:5;44824:9;:17;44820:87;;;44860:10;44852:28;;:47;44893:5;44881:9;:17;;;;:::i;:::-;44852:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44820:87;44708:204;:::o;28690:606::-;28766:21;;:::i;:::-;28807:16;28815:7;28807;:16::i;:::-;28799:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;28879:26;28927:12;28916:7;:23;28912:93;;28996:1;28981:12;28971:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;28950:47;;28912:93;29018:12;29033:7;29018:22;;29013:212;29050:18;29042:4;:26;29013:212;;29087:31;29121:11;:17;29133:4;29121:17;;;;;;;;;;;29087:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29177:1;29151:28;;:9;:14;;;:28;;;29147:71;;29199:9;29192:16;;;;;;;29147:71;29013:212;29070:6;;;;;:::i;:::-;;;;29013:212;;;;29233:57;;;;;;;;;;:::i;:::-;;;;;;;;28690:606;;;;:::o;42435:191::-;42509:16;42528:6;;;;;;;;;;;42509:25;;42554:8;42545:6;;:17;;;;;;;;;;;;;;;;;;42609:8;42578:40;;42599:8;42578:40;;;;;;;;;;;;42435:191;;:::o;38279:690::-;38416:4;38433:15;:2;:13;;;:15::i;:::-;38429:535;;;38488:2;38472:36;;;38509:12;:10;:12::i;:::-;38523:4;38529:7;38538:5;38472:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38459:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38720:1;38703:6;:13;:18;38699:215;;;38736:61;;;;;;;;;;:::i;:::-;;;;;;;;38699:215;38882:6;38876:13;38867:6;38863:2;38859:15;38852:38;38459:464;38604:45;;;38594:55;;;:6;:55;;;;38587:62;;;;;38429:535;38952:4;38945:11;;38279:690;;;;;;;:::o;45959:108::-;46019:13;46048;46041:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45959:108;:::o;400:723::-;456:13;686:1;677:5;:10;673:53;;;704:10;;;;;;;;;;;;;;;;;;;;;673:53;736:12;751:5;736:20;;767:14;792:78;807:1;799:4;:9;792:78;;825:8;;;;;:::i;:::-;;;;856:2;848:10;;;;;:::i;:::-;;;792:78;;;880:19;912:6;902:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;880:39;;930:154;946:1;937:5;:10;930:154;;974:1;964:11;;;;;:::i;:::-;;;1041:2;1033:5;:10;;;;:::i;:::-;1020:2;:24;;;;:::i;:::-;1007:39;;990:6;997;990:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;1070:2;1061:11;;;;;:::i;:::-;;;930:154;;;1108:6;1094:21;;;;;400:723;;;;:::o;28444:240::-;28505:7;28554:1;28537:19;;:5;:19;;;;28521:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;28645:12;:19;28658:5;28645:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;28637:41;;28630:48;;28444:240;;;:::o;39431:141::-;;;;;:::o;39958:140::-;;;;;:::o;33425:1272::-;33530:20;33553:12;;33530:35;;33594:1;33580:16;;:2;:16;;;;33572:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;33771:21;33779:12;33771:7;:21::i;:::-;33770:22;33762:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;33853:12;33841:8;:24;;33833:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;33913:61;33943:1;33947:2;33951:12;33965:8;33913:21;:61::i;:::-;33983:30;34016:12;:16;34029:2;34016:16;;;;;;;;;;;;;;;33983:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34058:119;;;;;;;;34108:8;34078:11;:19;;;:39;;;;:::i;:::-;34058:119;;;;;;34161:8;34126:11;:24;;;:44;;;;:::i;:::-;34058:119;;;;;34039:12;:16;34052:2;34039:16;;;;;;;;;;;;;;;:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34212:43;;;;;;;;34227:2;34212:43;;;;;;34238:15;34212:43;;;;;34184:11;:25;34196:12;34184:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34264:20;34287:12;34264:35;;34313:9;34308:281;34332:8;34328:1;:12;34308:281;;;34386:12;34382:2;34361:38;;34378:1;34361:38;;;;;;;;;;;;34426:59;34457:1;34461:2;34465:12;34479:5;34426:22;:59::i;:::-;34408:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;34567:14;;;;;:::i;:::-;;;;34342:3;;;;;:::i;:::-;;;;34308:281;;;;34612:12;34597;:27;;;;34631:60;34660:1;34664:2;34668:12;34682:8;34631:20;:60::i;:::-;33425:1272;;;;;;:::o;3392:326::-;3452:4;3709:1;3687:7;:19;;;:23;3680:30;;3392:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:655:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:2;;;414:1;411;404:12;350:2;450:1;435:238;460:6;457:1;454:13;435:238;;;528:3;557:37;590:3;578:10;557:37;:::i;:::-;552:3;545:50;624:4;619:3;615:14;608:21;;658:4;653:3;649:14;642:21;;495:178;482:1;479;475:9;470:14;;435:238;;;439:14;126:553;;;;;;;:::o;685:343::-;762:5;787:65;803:48;844:6;803:48;:::i;:::-;787:65;:::i;:::-;778:74;;875:6;868:5;861:21;913:4;906:5;902:16;951:3;942:6;937:3;933:16;930:25;927:2;;;968:1;965;958:12;927:2;981:41;1015:6;1010:3;1005;981:41;:::i;:::-;768:260;;;;;;:::o;1034:139::-;1080:5;1118:6;1105:20;1096:29;;1134:33;1161:5;1134:33;:::i;:::-;1086:87;;;;:::o;1196:303::-;1267:5;1316:3;1309:4;1301:6;1297:17;1293:27;1283:2;;1334:1;1331;1324:12;1283:2;1374:6;1361:20;1399:94;1489:3;1481:6;1474:4;1466:6;1462:17;1399:94;:::i;:::-;1390:103;;1273:226;;;;;:::o;1505:133::-;1548:5;1586:6;1573:20;1564:29;;1602:30;1626:5;1602:30;:::i;:::-;1554:84;;;;:::o;1644:137::-;1689:5;1727:6;1714:20;1705:29;;1743:32;1769:5;1743:32;:::i;:::-;1695:86;;;;:::o;1787:141::-;1843:5;1874:6;1868:13;1859:22;;1890:32;1916:5;1890:32;:::i;:::-;1849:79;;;;:::o;1947:271::-;2002:5;2051:3;2044:4;2036:6;2032:17;2028:27;2018:2;;2069:1;2066;2059:12;2018:2;2109:6;2096:20;2134:78;2208:3;2200:6;2193:4;2185:6;2181:17;2134:78;:::i;:::-;2125:87;;2008:210;;;;;:::o;2238:352::-;2296:8;2306:6;2356:3;2349:4;2341:6;2337:17;2333:27;2323:2;;2374:1;2371;2364:12;2323:2;2410:6;2397:20;2387:30;;2440:18;2432:6;2429:30;2426:2;;;2472:1;2469;2462:12;2426:2;2509:4;2501:6;2497:17;2485:29;;2563:3;2555:4;2547:6;2543:17;2533:8;2529:32;2526:41;2523:2;;;2580:1;2577;2570:12;2523:2;2313:277;;;;;:::o;2596:139::-;2642:5;2680:6;2667:20;2658:29;;2696:33;2723:5;2696:33;:::i;:::-;2648:87;;;;:::o;2741:262::-;2800:6;2849:2;2837:9;2828:7;2824:23;2820:32;2817:2;;;2865:1;2862;2855:12;2817:2;2908:1;2933:53;2978:7;2969:6;2958:9;2954:22;2933:53;:::i;:::-;2923:63;;2879:117;2807:196;;;;:::o;3009:407::-;3077:6;3085;3134:2;3122:9;3113:7;3109:23;3105:32;3102:2;;;3150:1;3147;3140:12;3102:2;3193:1;3218:53;3263:7;3254:6;3243:9;3239:22;3218:53;:::i;:::-;3208:63;;3164:117;3320:2;3346:53;3391:7;3382:6;3371:9;3367:22;3346:53;:::i;:::-;3336:63;;3291:118;3092:324;;;;;:::o;3422:552::-;3499:6;3507;3515;3564:2;3552:9;3543:7;3539:23;3535:32;3532:2;;;3580:1;3577;3570:12;3532:2;3623:1;3648:53;3693:7;3684:6;3673:9;3669:22;3648:53;:::i;:::-;3638:63;;3594:117;3750:2;3776:53;3821:7;3812:6;3801:9;3797:22;3776:53;:::i;:::-;3766:63;;3721:118;3878:2;3904:53;3949:7;3940:6;3929:9;3925:22;3904:53;:::i;:::-;3894:63;;3849:118;3522:452;;;;;:::o;3980:809::-;4075:6;4083;4091;4099;4148:3;4136:9;4127:7;4123:23;4119:33;4116:2;;;4165:1;4162;4155:12;4116:2;4208:1;4233:53;4278:7;4269:6;4258:9;4254:22;4233:53;:::i;:::-;4223:63;;4179:117;4335:2;4361:53;4406:7;4397:6;4386:9;4382:22;4361:53;:::i;:::-;4351:63;;4306:118;4463:2;4489:53;4534:7;4525:6;4514:9;4510:22;4489:53;:::i;:::-;4479:63;;4434:118;4619:2;4608:9;4604:18;4591:32;4650:18;4642:6;4639:30;4636:2;;;4682:1;4679;4672:12;4636:2;4710:62;4764:7;4755:6;4744:9;4740:22;4710:62;:::i;:::-;4700:72;;4562:220;4106:683;;;;;;;:::o;4795:401::-;4860:6;4868;4917:2;4905:9;4896:7;4892:23;4888:32;4885:2;;;4933:1;4930;4923:12;4885:2;4976:1;5001:53;5046:7;5037:6;5026:9;5022:22;5001:53;:::i;:::-;4991:63;;4947:117;5103:2;5129:50;5171:7;5162:6;5151:9;5147:22;5129:50;:::i;:::-;5119:60;;5074:115;4875:321;;;;;:::o;5202:407::-;5270:6;5278;5327:2;5315:9;5306:7;5302:23;5298:32;5295:2;;;5343:1;5340;5333:12;5295:2;5386:1;5411:53;5456:7;5447:6;5436:9;5432:22;5411:53;:::i;:::-;5401:63;;5357:117;5513:2;5539:53;5584:7;5575:6;5564:9;5560:22;5539:53;:::i;:::-;5529:63;;5484:118;5285:324;;;;;:::o;5615:550::-;5708:6;5716;5765:2;5753:9;5744:7;5740:23;5736:32;5733:2;;;5781:1;5778;5771:12;5733:2;5852:1;5841:9;5837:17;5824:31;5882:18;5874:6;5871:30;5868:2;;;5914:1;5911;5904:12;5868:2;5942:78;6012:7;6003:6;5992:9;5988:22;5942:78;:::i;:::-;5932:88;;5795:235;6069:2;6095:53;6140:7;6131:6;6120:9;6116:22;6095:53;:::i;:::-;6085:63;;6040:118;5723:442;;;;;:::o;6171:256::-;6227:6;6276:2;6264:9;6255:7;6251:23;6247:32;6244:2;;;6292:1;6289;6282:12;6244:2;6335:1;6360:50;6402:7;6393:6;6382:9;6378:22;6360:50;:::i;:::-;6350:60;;6306:114;6234:193;;;;:::o;6433:260::-;6491:6;6540:2;6528:9;6519:7;6515:23;6511:32;6508:2;;;6556:1;6553;6546:12;6508:2;6599:1;6624:52;6668:7;6659:6;6648:9;6644:22;6624:52;:::i;:::-;6614:62;;6570:116;6498:195;;;;:::o;6699:282::-;6768:6;6817:2;6805:9;6796:7;6792:23;6788:32;6785:2;;;6833:1;6830;6823:12;6785:2;6876:1;6901:63;6956:7;6947:6;6936:9;6932:22;6901:63;:::i;:::-;6891:73;;6847:127;6775:206;;;;:::o;6987:395::-;7058:6;7066;7115:2;7103:9;7094:7;7090:23;7086:32;7083:2;;;7131:1;7128;7121:12;7083:2;7202:1;7191:9;7187:17;7174:31;7232:18;7224:6;7221:30;7218:2;;;7264:1;7261;7254:12;7218:2;7300:65;7357:7;7348:6;7337:9;7333:22;7300:65;:::i;:::-;7282:83;;;;7145:230;7073:309;;;;;:::o;7388:262::-;7447:6;7496:2;7484:9;7475:7;7471:23;7467:32;7464:2;;;7512:1;7509;7502:12;7464:2;7555:1;7580:53;7625:7;7616:6;7605:9;7601:22;7580:53;:::i;:::-;7570:63;;7526:117;7454:196;;;;:::o;7656:108::-;7733:24;7751:5;7733:24;:::i;:::-;7728:3;7721:37;7711:53;;:::o;7770:118::-;7857:24;7875:5;7857:24;:::i;:::-;7852:3;7845:37;7835:53;;:::o;7894:109::-;7975:21;7990:5;7975:21;:::i;:::-;7970:3;7963:34;7953:50;;:::o;8009:360::-;8095:3;8123:38;8155:5;8123:38;:::i;:::-;8177:70;8240:6;8235:3;8177:70;:::i;:::-;8170:77;;8256:52;8301:6;8296:3;8289:4;8282:5;8278:16;8256:52;:::i;:::-;8333:29;8355:6;8333:29;:::i;:::-;8328:3;8324:39;8317:46;;8099:270;;;;;:::o;8375:364::-;8463:3;8491:39;8524:5;8491:39;:::i;:::-;8546:71;8610:6;8605:3;8546:71;:::i;:::-;8539:78;;8626:52;8671:6;8666:3;8659:4;8652:5;8648:16;8626:52;:::i;:::-;8703:29;8725:6;8703:29;:::i;:::-;8698:3;8694:39;8687:46;;8467:272;;;;;:::o;8745:377::-;8851:3;8879:39;8912:5;8879:39;:::i;:::-;8934:89;9016:6;9011:3;8934:89;:::i;:::-;8927:96;;9032:52;9077:6;9072:3;9065:4;9058:5;9054:16;9032:52;:::i;:::-;9109:6;9104:3;9100:16;9093:23;;8855:267;;;;;:::o;9128:366::-;9270:3;9291:67;9355:2;9350:3;9291:67;:::i;:::-;9284:74;;9367:93;9456:3;9367:93;:::i;:::-;9485:2;9480:3;9476:12;9469:19;;9274:220;;;:::o;9500:366::-;9642:3;9663:67;9727:2;9722:3;9663:67;:::i;:::-;9656:74;;9739:93;9828:3;9739:93;:::i;:::-;9857:2;9852:3;9848:12;9841:19;;9646:220;;;:::o;9872:366::-;10014:3;10035:67;10099:2;10094:3;10035:67;:::i;:::-;10028:74;;10111:93;10200:3;10111:93;:::i;:::-;10229:2;10224:3;10220:12;10213:19;;10018:220;;;:::o;10244:366::-;10386:3;10407:67;10471:2;10466:3;10407:67;:::i;:::-;10400:74;;10483:93;10572:3;10483:93;:::i;:::-;10601:2;10596:3;10592:12;10585:19;;10390:220;;;:::o;10616:366::-;10758:3;10779:67;10843:2;10838:3;10779:67;:::i;:::-;10772:74;;10855:93;10944:3;10855:93;:::i;:::-;10973:2;10968:3;10964:12;10957:19;;10762:220;;;:::o;10988:366::-;11130:3;11151:67;11215:2;11210:3;11151:67;:::i;:::-;11144:74;;11227:93;11316:3;11227:93;:::i;:::-;11345:2;11340:3;11336:12;11329:19;;11134:220;;;:::o;11360:366::-;11502:3;11523:67;11587:2;11582:3;11523:67;:::i;:::-;11516:74;;11599:93;11688:3;11599:93;:::i;:::-;11717:2;11712:3;11708:12;11701:19;;11506:220;;;:::o;11732:366::-;11874:3;11895:67;11959:2;11954:3;11895:67;:::i;:::-;11888:74;;11971:93;12060:3;11971:93;:::i;:::-;12089:2;12084:3;12080:12;12073:19;;11878:220;;;:::o;12104:366::-;12246:3;12267:67;12331:2;12326:3;12267:67;:::i;:::-;12260:74;;12343:93;12432:3;12343:93;:::i;:::-;12461:2;12456:3;12452:12;12445:19;;12250:220;;;:::o;12476:366::-;12618:3;12639:67;12703:2;12698:3;12639:67;:::i;:::-;12632:74;;12715:93;12804:3;12715:93;:::i;:::-;12833:2;12828:3;12824:12;12817:19;;12622:220;;;:::o;12848:366::-;12990:3;13011:67;13075:2;13070:3;13011:67;:::i;:::-;13004:74;;13087:93;13176:3;13087:93;:::i;:::-;13205:2;13200:3;13196:12;13189:19;;12994:220;;;:::o;13220:366::-;13362:3;13383:67;13447:2;13442:3;13383:67;:::i;:::-;13376:74;;13459:93;13548:3;13459:93;:::i;:::-;13577:2;13572:3;13568:12;13561:19;;13366:220;;;:::o;13592:366::-;13734:3;13755:67;13819:2;13814:3;13755:67;:::i;:::-;13748:74;;13831:93;13920:3;13831:93;:::i;:::-;13949:2;13944:3;13940:12;13933:19;;13738:220;;;:::o;13964:366::-;14106:3;14127:67;14191:2;14186:3;14127:67;:::i;:::-;14120:74;;14203:93;14292:3;14203:93;:::i;:::-;14321:2;14316:3;14312:12;14305:19;;14110:220;;;:::o;14336:366::-;14478:3;14499:67;14563:2;14558:3;14499:67;:::i;:::-;14492:74;;14575:93;14664:3;14575:93;:::i;:::-;14693:2;14688:3;14684:12;14677:19;;14482:220;;;:::o;14708:366::-;14850:3;14871:67;14935:2;14930:3;14871:67;:::i;:::-;14864:74;;14947:93;15036:3;14947:93;:::i;:::-;15065:2;15060:3;15056:12;15049:19;;14854:220;;;:::o;15080:366::-;15222:3;15243:67;15307:2;15302:3;15243:67;:::i;:::-;15236:74;;15319:93;15408:3;15319:93;:::i;:::-;15437:2;15432:3;15428:12;15421:19;;15226:220;;;:::o;15452:366::-;15594:3;15615:67;15679:2;15674:3;15615:67;:::i;:::-;15608:74;;15691:93;15780:3;15691:93;:::i;:::-;15809:2;15804:3;15800:12;15793:19;;15598:220;;;:::o;15824:366::-;15966:3;15987:67;16051:2;16046:3;15987:67;:::i;:::-;15980:74;;16063:93;16152:3;16063:93;:::i;:::-;16181:2;16176:3;16172:12;16165:19;;15970:220;;;:::o;16196:398::-;16355:3;16376:83;16457:1;16452:3;16376:83;:::i;:::-;16369:90;;16468:93;16557:3;16468:93;:::i;:::-;16586:1;16581:3;16577:11;16570:18;;16359:235;;;:::o;16600:366::-;16742:3;16763:67;16827:2;16822:3;16763:67;:::i;:::-;16756:74;;16839:93;16928:3;16839:93;:::i;:::-;16957:2;16952:3;16948:12;16941:19;;16746:220;;;:::o;16972:366::-;17114:3;17135:67;17199:2;17194:3;17135:67;:::i;:::-;17128:74;;17211:93;17300:3;17211:93;:::i;:::-;17329:2;17324:3;17320:12;17313:19;;17118:220;;;:::o;17344:366::-;17486:3;17507:67;17571:2;17566:3;17507:67;:::i;:::-;17500:74;;17583:93;17672:3;17583:93;:::i;:::-;17701:2;17696:3;17692:12;17685:19;;17490:220;;;:::o;17716:366::-;17858:3;17879:67;17943:2;17938:3;17879:67;:::i;:::-;17872:74;;17955:93;18044:3;17955:93;:::i;:::-;18073:2;18068:3;18064:12;18057:19;;17862:220;;;:::o;18088:366::-;18230:3;18251:67;18315:2;18310:3;18251:67;:::i;:::-;18244:74;;18327:93;18416:3;18327:93;:::i;:::-;18445:2;18440:3;18436:12;18429:19;;18234:220;;;:::o;18460:366::-;18602:3;18623:67;18687:2;18682:3;18623:67;:::i;:::-;18616:74;;18699:93;18788:3;18699:93;:::i;:::-;18817:2;18812:3;18808:12;18801:19;;18606:220;;;:::o;18832:366::-;18974:3;18995:67;19059:2;19054:3;18995:67;:::i;:::-;18988:74;;19071:93;19160:3;19071:93;:::i;:::-;19189:2;19184:3;19180:12;19173:19;;18978:220;;;:::o;19204:366::-;19346:3;19367:67;19431:2;19426:3;19367:67;:::i;:::-;19360:74;;19443:93;19532:3;19443:93;:::i;:::-;19561:2;19556:3;19552:12;19545:19;;19350:220;;;:::o;19576:366::-;19718:3;19739:67;19803:2;19798:3;19739:67;:::i;:::-;19732:74;;19815:93;19904:3;19815:93;:::i;:::-;19933:2;19928:3;19924:12;19917:19;;19722:220;;;:::o;19948:366::-;20090:3;20111:67;20175:2;20170:3;20111:67;:::i;:::-;20104:74;;20187:93;20276:3;20187:93;:::i;:::-;20305:2;20300:3;20296:12;20289:19;;20094:220;;;:::o;20320:366::-;20462:3;20483:67;20547:2;20542:3;20483:67;:::i;:::-;20476:74;;20559:93;20648:3;20559:93;:::i;:::-;20677:2;20672:3;20668:12;20661:19;;20466:220;;;:::o;20692:366::-;20834:3;20855:67;20919:2;20914:3;20855:67;:::i;:::-;20848:74;;20931:93;21020:3;20931:93;:::i;:::-;21049:2;21044:3;21040:12;21033:19;;20838:220;;;:::o;21134:527::-;21293:4;21288:3;21284:14;21380:4;21373:5;21369:16;21363:23;21399:63;21456:4;21451:3;21447:14;21433:12;21399:63;:::i;:::-;21308:164;21564:4;21557:5;21553:16;21547:23;21583:61;21638:4;21633:3;21629:14;21615:12;21583:61;:::i;:::-;21482:172;21262:399;;;:::o;21667:118::-;21754:24;21772:5;21754:24;:::i;:::-;21749:3;21742:37;21732:53;;:::o;21791:105::-;21866:23;21883:5;21866:23;:::i;:::-;21861:3;21854:36;21844:52;;:::o;21902:115::-;21987:23;22004:5;21987:23;:::i;:::-;21982:3;21975:36;21965:52;;:::o;22023:435::-;22203:3;22225:95;22316:3;22307:6;22225:95;:::i;:::-;22218:102;;22337:95;22428:3;22419:6;22337:95;:::i;:::-;22330:102;;22449:3;22442:10;;22207:251;;;;;:::o;22464:379::-;22648:3;22670:147;22813:3;22670:147;:::i;:::-;22663:154;;22834:3;22827:10;;22652:191;;;:::o;22849:222::-;22942:4;22980:2;22969:9;22965:18;22957:26;;22993:71;23061:1;23050:9;23046:17;23037:6;22993:71;:::i;:::-;22947:124;;;;:::o;23077:640::-;23272:4;23310:3;23299:9;23295:19;23287:27;;23324:71;23392:1;23381:9;23377:17;23368:6;23324:71;:::i;:::-;23405:72;23473:2;23462:9;23458:18;23449:6;23405:72;:::i;:::-;23487;23555:2;23544:9;23540:18;23531:6;23487:72;:::i;:::-;23606:9;23600:4;23596:20;23591:2;23580:9;23576:18;23569:48;23634:76;23705:4;23696:6;23634:76;:::i;:::-;23626:84;;23277:440;;;;;;;:::o;23723:210::-;23810:4;23848:2;23837:9;23833:18;23825:26;;23861:65;23923:1;23912:9;23908:17;23899:6;23861:65;:::i;:::-;23815:118;;;;:::o;23939:313::-;24052:4;24090:2;24079:9;24075:18;24067:26;;24139:9;24133:4;24129:20;24125:1;24114:9;24110:17;24103:47;24167:78;24240:4;24231:6;24167:78;:::i;:::-;24159:86;;24057:195;;;;:::o;24258:419::-;24424:4;24462:2;24451:9;24447:18;24439:26;;24511:9;24505:4;24501:20;24497:1;24486:9;24482:17;24475:47;24539:131;24665:4;24539:131;:::i;:::-;24531:139;;24429:248;;;:::o;24683:419::-;24849:4;24887:2;24876:9;24872:18;24864:26;;24936:9;24930:4;24926:20;24922:1;24911:9;24907:17;24900:47;24964:131;25090:4;24964:131;:::i;:::-;24956:139;;24854:248;;;:::o;25108:419::-;25274:4;25312:2;25301:9;25297:18;25289:26;;25361:9;25355:4;25351:20;25347:1;25336:9;25332:17;25325:47;25389:131;25515:4;25389:131;:::i;:::-;25381:139;;25279:248;;;:::o;25533:419::-;25699:4;25737:2;25726:9;25722:18;25714:26;;25786:9;25780:4;25776:20;25772:1;25761:9;25757:17;25750:47;25814:131;25940:4;25814:131;:::i;:::-;25806:139;;25704:248;;;:::o;25958:419::-;26124:4;26162:2;26151:9;26147:18;26139:26;;26211:9;26205:4;26201:20;26197:1;26186:9;26182:17;26175:47;26239:131;26365:4;26239:131;:::i;:::-;26231:139;;26129:248;;;:::o;26383:419::-;26549:4;26587:2;26576:9;26572:18;26564:26;;26636:9;26630:4;26626:20;26622:1;26611:9;26607:17;26600:47;26664:131;26790:4;26664:131;:::i;:::-;26656:139;;26554:248;;;:::o;26808:419::-;26974:4;27012:2;27001:9;26997:18;26989:26;;27061:9;27055:4;27051:20;27047:1;27036:9;27032:17;27025:47;27089:131;27215:4;27089:131;:::i;:::-;27081:139;;26979:248;;;:::o;27233:419::-;27399:4;27437:2;27426:9;27422:18;27414:26;;27486:9;27480:4;27476:20;27472:1;27461:9;27457:17;27450:47;27514:131;27640:4;27514:131;:::i;:::-;27506:139;;27404:248;;;:::o;27658:419::-;27824:4;27862:2;27851:9;27847:18;27839:26;;27911:9;27905:4;27901:20;27897:1;27886:9;27882:17;27875:47;27939:131;28065:4;27939:131;:::i;:::-;27931:139;;27829:248;;;:::o;28083:419::-;28249:4;28287:2;28276:9;28272:18;28264:26;;28336:9;28330:4;28326:20;28322:1;28311:9;28307:17;28300:47;28364:131;28490:4;28364:131;:::i;:::-;28356:139;;28254:248;;;:::o;28508:419::-;28674:4;28712:2;28701:9;28697:18;28689:26;;28761:9;28755:4;28751:20;28747:1;28736:9;28732:17;28725:47;28789:131;28915:4;28789:131;:::i;:::-;28781:139;;28679:248;;;:::o;28933:419::-;29099:4;29137:2;29126:9;29122:18;29114:26;;29186:9;29180:4;29176:20;29172:1;29161:9;29157:17;29150:47;29214:131;29340:4;29214:131;:::i;:::-;29206:139;;29104:248;;;:::o;29358:419::-;29524:4;29562:2;29551:9;29547:18;29539:26;;29611:9;29605:4;29601:20;29597:1;29586:9;29582:17;29575:47;29639:131;29765:4;29639:131;:::i;:::-;29631:139;;29529:248;;;:::o;29783:419::-;29949:4;29987:2;29976:9;29972:18;29964:26;;30036:9;30030:4;30026:20;30022:1;30011:9;30007:17;30000:47;30064:131;30190:4;30064:131;:::i;:::-;30056:139;;29954:248;;;:::o;30208:419::-;30374:4;30412:2;30401:9;30397:18;30389:26;;30461:9;30455:4;30451:20;30447:1;30436:9;30432:17;30425:47;30489:131;30615:4;30489:131;:::i;:::-;30481:139;;30379:248;;;:::o;30633:419::-;30799:4;30837:2;30826:9;30822:18;30814:26;;30886:9;30880:4;30876:20;30872:1;30861:9;30857:17;30850:47;30914:131;31040:4;30914:131;:::i;:::-;30906:139;;30804:248;;;:::o;31058:419::-;31224:4;31262:2;31251:9;31247:18;31239:26;;31311:9;31305:4;31301:20;31297:1;31286:9;31282:17;31275:47;31339:131;31465:4;31339:131;:::i;:::-;31331:139;;31229:248;;;:::o;31483:419::-;31649:4;31687:2;31676:9;31672:18;31664:26;;31736:9;31730:4;31726:20;31722:1;31711:9;31707:17;31700:47;31764:131;31890:4;31764:131;:::i;:::-;31756:139;;31654:248;;;:::o;31908:419::-;32074:4;32112:2;32101:9;32097:18;32089:26;;32161:9;32155:4;32151:20;32147:1;32136:9;32132:17;32125:47;32189:131;32315:4;32189:131;:::i;:::-;32181:139;;32079:248;;;:::o;32333:419::-;32499:4;32537:2;32526:9;32522:18;32514:26;;32586:9;32580:4;32576:20;32572:1;32561:9;32557:17;32550:47;32614:131;32740:4;32614:131;:::i;:::-;32606:139;;32504:248;;;:::o;32758:419::-;32924:4;32962:2;32951:9;32947:18;32939:26;;33011:9;33005:4;33001:20;32997:1;32986:9;32982:17;32975:47;33039:131;33165:4;33039:131;:::i;:::-;33031:139;;32929:248;;;:::o;33183:419::-;33349:4;33387:2;33376:9;33372:18;33364:26;;33436:9;33430:4;33426:20;33422:1;33411:9;33407:17;33400:47;33464:131;33590:4;33464:131;:::i;:::-;33456:139;;33354:248;;;:::o;33608:419::-;33774:4;33812:2;33801:9;33797:18;33789:26;;33861:9;33855:4;33851:20;33847:1;33836:9;33832:17;33825:47;33889:131;34015:4;33889:131;:::i;:::-;33881:139;;33779:248;;;:::o;34033:419::-;34199:4;34237:2;34226:9;34222:18;34214:26;;34286:9;34280:4;34276:20;34272:1;34261:9;34257:17;34250:47;34314:131;34440:4;34314:131;:::i;:::-;34306:139;;34204:248;;;:::o;34458:419::-;34624:4;34662:2;34651:9;34647:18;34639:26;;34711:9;34705:4;34701:20;34697:1;34686:9;34682:17;34675:47;34739:131;34865:4;34739:131;:::i;:::-;34731:139;;34629:248;;;:::o;34883:419::-;35049:4;35087:2;35076:9;35072:18;35064:26;;35136:9;35130:4;35126:20;35122:1;35111:9;35107:17;35100:47;35164:131;35290:4;35164:131;:::i;:::-;35156:139;;35054:248;;;:::o;35308:419::-;35474:4;35512:2;35501:9;35497:18;35489:26;;35561:9;35555:4;35551:20;35547:1;35536:9;35532:17;35525:47;35589:131;35715:4;35589:131;:::i;:::-;35581:139;;35479:248;;;:::o;35733:419::-;35899:4;35937:2;35926:9;35922:18;35914:26;;35986:9;35980:4;35976:20;35972:1;35961:9;35957:17;35950:47;36014:131;36140:4;36014:131;:::i;:::-;36006:139;;35904:248;;;:::o;36158:419::-;36324:4;36362:2;36351:9;36347:18;36339:26;;36411:9;36405:4;36401:20;36397:1;36386:9;36382:17;36375:47;36439:131;36565:4;36439:131;:::i;:::-;36431:139;;36329:248;;;:::o;36583:419::-;36749:4;36787:2;36776:9;36772:18;36764:26;;36836:9;36830:4;36826:20;36822:1;36811:9;36807:17;36800:47;36864:131;36990:4;36864:131;:::i;:::-;36856:139;;36754:248;;;:::o;37008:419::-;37174:4;37212:2;37201:9;37197:18;37189:26;;37261:9;37255:4;37251:20;37247:1;37236:9;37232:17;37225:47;37289:131;37415:4;37289:131;:::i;:::-;37281:139;;37179:248;;;:::o;37433:346::-;37588:4;37626:2;37615:9;37611:18;37603:26;;37639:133;37769:1;37758:9;37754:17;37745:6;37639:133;:::i;:::-;37593:186;;;;:::o;37785:222::-;37878:4;37916:2;37905:9;37901:18;37893:26;;37929:71;37997:1;37986:9;37982:17;37973:6;37929:71;:::i;:::-;37883:124;;;;:::o;38013:316::-;38126:4;38164:2;38153:9;38149:18;38141:26;;38177:69;38243:1;38232:9;38228:17;38219:6;38177:69;:::i;:::-;38256:66;38318:2;38307:9;38303:18;38294:6;38256:66;:::i;:::-;38131:198;;;;;:::o;38335:129::-;38369:6;38396:20;;:::i;:::-;38386:30;;38425:33;38453:4;38445:6;38425:33;:::i;:::-;38376:88;;;:::o;38470:75::-;38503:6;38536:2;38530:9;38520:19;;38510:35;:::o;38551:311::-;38628:4;38718:18;38710:6;38707:30;38704:2;;;38740:18;;:::i;:::-;38704:2;38790:4;38782:6;38778:17;38770:25;;38850:4;38844;38840:15;38832:23;;38633:229;;;:::o;38868:307::-;38929:4;39019:18;39011:6;39008:30;39005:2;;;39041:18;;:::i;:::-;39005:2;39079:29;39101:6;39079:29;:::i;:::-;39071:37;;39163:4;39157;39153:15;39145:23;;38934:241;;;:::o;39181:98::-;39232:6;39266:5;39260:12;39250:22;;39239:40;;;:::o;39285:99::-;39337:6;39371:5;39365:12;39355:22;;39344:40;;;:::o;39390:168::-;39473:11;39507:6;39502:3;39495:19;39547:4;39542:3;39538:14;39523:29;;39485:73;;;;:::o;39564:147::-;39665:11;39702:3;39687:18;;39677:34;;;;:::o;39717:169::-;39801:11;39835:6;39830:3;39823:19;39875:4;39870:3;39866:14;39851:29;;39813:73;;;;:::o;39892:148::-;39994:11;40031:3;40016:18;;40006:34;;;;:::o;40046:273::-;40086:3;40105:20;40123:1;40105:20;:::i;:::-;40100:25;;40139:20;40157:1;40139:20;:::i;:::-;40134:25;;40261:1;40225:34;40221:42;40218:1;40215:49;40212:2;;;40267:18;;:::i;:::-;40212:2;40311:1;40308;40304:9;40297:16;;40090:229;;;;:::o;40325:305::-;40365:3;40384:20;40402:1;40384:20;:::i;:::-;40379:25;;40418:20;40436:1;40418:20;:::i;:::-;40413:25;;40572:1;40504:66;40500:74;40497:1;40494:81;40491:2;;;40578:18;;:::i;:::-;40491:2;40622:1;40619;40615:9;40608:16;;40369:261;;;;:::o;40636:185::-;40676:1;40693:20;40711:1;40693:20;:::i;:::-;40688:25;;40727:20;40745:1;40727:20;:::i;:::-;40722:25;;40766:1;40756:2;;40771:18;;:::i;:::-;40756:2;40813:1;40810;40806:9;40801:14;;40678:143;;;;:::o;40827:348::-;40867:7;40890:20;40908:1;40890:20;:::i;:::-;40885:25;;40924:20;40942:1;40924:20;:::i;:::-;40919:25;;41112:1;41044:66;41040:74;41037:1;41034:81;41029:1;41022:9;41015:17;41011:105;41008:2;;;41119:18;;:::i;:::-;41008:2;41167:1;41164;41160:9;41149:20;;40875:300;;;;:::o;41181:191::-;41221:4;41241:20;41259:1;41241:20;:::i;:::-;41236:25;;41275:20;41293:1;41275:20;:::i;:::-;41270:25;;41314:1;41311;41308:8;41305:2;;;41319:18;;:::i;:::-;41305:2;41364:1;41361;41357:9;41349:17;;41226:146;;;;:::o;41378:191::-;41418:4;41438:20;41456:1;41438:20;:::i;:::-;41433:25;;41472:20;41490:1;41472:20;:::i;:::-;41467:25;;41511:1;41508;41505:8;41502:2;;;41516:18;;:::i;:::-;41502:2;41561:1;41558;41554:9;41546:17;;41423:146;;;;:::o;41575:96::-;41612:7;41641:24;41659:5;41641:24;:::i;:::-;41630:35;;41620:51;;;:::o;41677:90::-;41711:7;41754:5;41747:13;41740:21;41729:32;;41719:48;;;:::o;41773:149::-;41809:7;41849:66;41842:5;41838:78;41827:89;;41817:105;;;:::o;41928:118::-;41965:7;42005:34;41998:5;41994:46;41983:57;;41973:73;;;:::o;42052:126::-;42089:7;42129:42;42122:5;42118:54;42107:65;;42097:81;;;:::o;42184:77::-;42221:7;42250:5;42239:16;;42229:32;;;:::o;42267:101::-;42303:7;42343:18;42336:5;42332:30;42321:41;;42311:57;;;:::o;42374:154::-;42458:6;42453:3;42448;42435:30;42520:1;42511:6;42506:3;42502:16;42495:27;42425:103;;;:::o;42534:307::-;42602:1;42612:113;42626:6;42623:1;42620:13;42612:113;;;42711:1;42706:3;42702:11;42696:18;42692:1;42687:3;42683:11;42676:39;42648:2;42645:1;42641:10;42636:15;;42612:113;;;42743:6;42740:1;42737:13;42734:2;;;42823:1;42814:6;42809:3;42805:16;42798:27;42734:2;42583:258;;;;:::o;42847:171::-;42886:3;42909:24;42927:5;42909:24;:::i;:::-;42900:33;;42955:4;42948:5;42945:15;42942:2;;;42963:18;;:::i;:::-;42942:2;43010:1;43003:5;42999:13;42992:20;;42890:128;;;:::o;43024:320::-;43068:6;43105:1;43099:4;43095:12;43085:22;;43152:1;43146:4;43142:12;43173:18;43163:2;;43229:4;43221:6;43217:17;43207:27;;43163:2;43291;43283:6;43280:14;43260:18;43257:38;43254:2;;;43310:18;;:::i;:::-;43254:2;43075:269;;;;:::o;43350:281::-;43433:27;43455:4;43433:27;:::i;:::-;43425:6;43421:40;43563:6;43551:10;43548:22;43527:18;43515:10;43512:34;43509:62;43506:2;;;43574:18;;:::i;:::-;43506:2;43614:10;43610:2;43603:22;43393:238;;;:::o;43637:233::-;43676:3;43699:24;43717:5;43699:24;:::i;:::-;43690:33;;43745:66;43738:5;43735:77;43732:2;;;43815:18;;:::i;:::-;43732:2;43862:1;43855:5;43851:13;43844:20;;43680:190;;;:::o;43876:176::-;43908:1;43925:20;43943:1;43925:20;:::i;:::-;43920:25;;43959:20;43977:1;43959:20;:::i;:::-;43954:25;;43998:1;43988:2;;44003:18;;:::i;:::-;43988:2;44044:1;44041;44037:9;44032:14;;43910:142;;;;:::o;44058:180::-;44106:77;44103:1;44096:88;44203:4;44200:1;44193:15;44227:4;44224:1;44217:15;44244:180;44292:77;44289:1;44282:88;44389:4;44386:1;44379:15;44413:4;44410:1;44403:15;44430:180;44478:77;44475:1;44468:88;44575:4;44572:1;44565:15;44599:4;44596:1;44589:15;44616:180;44664:77;44661:1;44654:88;44761:4;44758:1;44751:15;44785:4;44782:1;44775:15;44802:102;44843:6;44894:2;44890:7;44885:2;44878:5;44874:14;44870:28;44860:38;;44850:54;;;:::o;44910:221::-;45050:34;45046:1;45038:6;45034:14;45027:58;45119:4;45114:2;45106:6;45102:15;45095:29;45016:115;:::o;45137:225::-;45277:34;45273:1;45265:6;45261:14;45254:58;45346:8;45341:2;45333:6;45329:15;45322:33;45243:119;:::o;45368:229::-;45508:34;45504:1;45496:6;45492:14;45485:58;45577:12;45572:2;45564:6;45560:15;45553:37;45474:123;:::o;45603:231::-;45743:34;45739:1;45731:6;45727:14;45720:58;45812:14;45807:2;45799:6;45795:15;45788:39;45709:125;:::o;45840:222::-;45980:34;45976:1;45968:6;45964:14;45957:58;46049:5;46044:2;46036:6;46032:15;46025:30;45946:116;:::o;46068:224::-;46208:34;46204:1;46196:6;46192:14;46185:58;46277:7;46272:2;46264:6;46260:15;46253:32;46174:118;:::o;46298:236::-;46438:34;46434:1;46426:6;46422:14;46415:58;46507:19;46502:2;46494:6;46490:15;46483:44;46404:130;:::o;46540:180::-;46680:32;46676:1;46668:6;46664:14;46657:56;46646:74;:::o;46726:244::-;46866:34;46862:1;46854:6;46850:14;46843:58;46935:27;46930:2;46922:6;46918:15;46911:52;46832:138;:::o;46976:174::-;47116:26;47112:1;47104:6;47100:14;47093:50;47082:68;:::o;47156:230::-;47296:34;47292:1;47284:6;47280:14;47273:58;47365:13;47360:2;47352:6;47348:15;47341:38;47262:124;:::o;47392:168::-;47532:20;47528:1;47520:6;47516:14;47509:44;47498:62;:::o;47566:225::-;47706:34;47702:1;47694:6;47690:14;47683:58;47775:8;47770:2;47762:6;47758:15;47751:33;47672:119;:::o;47797:182::-;47937:34;47933:1;47925:6;47921:14;47914:58;47903:76;:::o;47985:234::-;48125:34;48121:1;48113:6;48109:14;48102:58;48194:17;48189:2;48181:6;48177:15;48170:42;48091:128;:::o;48225:176::-;48365:28;48361:1;48353:6;48349:14;48342:52;48331:70;:::o;48407:237::-;48547:34;48543:1;48535:6;48531:14;48524:58;48616:20;48611:2;48603:6;48599:15;48592:45;48513:131;:::o;48650:179::-;48790:31;48786:1;48778:6;48774:14;48767:55;48756:73;:::o;48835:221::-;48975:34;48971:1;48963:6;48959:14;48952:58;49044:4;49039:2;49031:6;49027:15;49020:29;48941:115;:::o;49062:114::-;49168:8;:::o;49182:166::-;49322:18;49318:1;49310:6;49306:14;49299:42;49288:60;:::o;49354:238::-;49494:34;49490:1;49482:6;49478:14;49471:58;49563:21;49558:2;49550:6;49546:15;49539:46;49460:132;:::o;49598:172::-;49738:24;49734:1;49726:6;49722:14;49715:48;49704:66;:::o;49776:179::-;49916:31;49912:1;49904:6;49900:14;49893:55;49882:73;:::o;49961:220::-;50101:34;50097:1;50089:6;50085:14;50078:58;50170:3;50165:2;50157:6;50153:15;50146:28;50067:114;:::o;50187:172::-;50327:24;50323:1;50315:6;50311:14;50304:48;50293:66;:::o;50365:233::-;50505:34;50501:1;50493:6;50489:14;50482:58;50574:16;50569:2;50561:6;50557:15;50550:41;50471:127;:::o;50604:225::-;50744:34;50740:1;50732:6;50728:14;50721:58;50813:8;50808:2;50800:6;50796:15;50789:33;50710:119;:::o;50835:181::-;50975:33;50971:1;50963:6;50959:14;50952:57;50941:75;:::o;51022:234::-;51162:34;51158:1;51150:6;51146:14;51139:58;51231:17;51226:2;51218:6;51214:15;51207:42;51128:128;:::o;51262:232::-;51402:34;51398:1;51390:6;51386:14;51379:58;51471:15;51466:2;51458:6;51454:15;51447:40;51368:126;:::o;51500:221::-;51640:34;51636:1;51628:6;51624:14;51617:58;51709:4;51704:2;51696:6;51692:15;51685:29;51606:115;:::o;51727:122::-;51800:24;51818:5;51800:24;:::i;:::-;51793:5;51790:35;51780:2;;51839:1;51836;51829:12;51780:2;51770:79;:::o;51855:116::-;51925:21;51940:5;51925:21;:::i;:::-;51918:5;51915:32;51905:2;;51961:1;51958;51951:12;51905:2;51895:76;:::o;51977:120::-;52049:23;52066:5;52049:23;:::i;:::-;52042:5;52039:34;52029:2;;52087:1;52084;52077:12;52029:2;52019:78;:::o;52103:122::-;52176:24;52194:5;52176:24;:::i;:::-;52169:5;52166:35;52156:2;;52215:1;52212;52205:12;52156:2;52146:79;:::o
Swarm Source
ipfs://97a138284e3ecbf0dd30f6226eb1c65bc82d9098866bff7b2cdfdb1bdd855df8
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.