Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
341 NMO
Holders
6
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 NMOLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ArthaneetiDAOv1
Compiler Version
v0.8.21+commit.d9974bed
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./Ownable.sol"; import "./Strings.sol"; import "./ReentrancyGuard.sol"; import { IERC2981, IERC165 } from "./IERC2981.sol"; import "./ERC165.sol"; import "./ERC721.sol"; contract ArthaneetiDAOv1 is ERC721, IERC2981, Ownable, ReentrancyGuard { // Declarations using Strings for uint256; uint256 private MAX_SUPPLY = 400000; uint256 private _currentId; uint256 public totalBatches; string public baseURI; string private _contractURI; bool public isActive = false; bool public isWLActive = false; address public beneficiary; address public royalties; constructor( address _beneficiary, address _royalties, string memory _initialBaseURI, string memory _initialContractURI ) ERC721("NaMo DAO Arthanagrik Passport", "NMO") { beneficiary = _beneficiary; royalties = _royalties; baseURI = _initialBaseURI; _contractURI = _initialContractURI; } struct Batch { string name; uint256 maxSupply; uint256 currentSupply; uint256 price; bool isActive; } // Mappings // Add a mapping to store Allowed Minters mapping(address => uint256) public allowedMinters; // Add a mapping to store the Batchs mapping(uint256 => Batch) public Batchs; // Add a nested mapping to store the whitelisted addresses for each Batch mapping(uint256 => mapping(address => uint256)) public whitelisted; // Add a mapping to store the batchOfToken mapping(uint256 => uint256) public batchOfToken; // Add a mapping for the blacklist mapping(uint256 => bool) public blacklistedTokens; mapping(address => bool) public blacklistedAddresses; event TokenURICreated(uint256 indexed tokenId, string uri); event TokenRemovedFromBlacklist(uint256 indexed tokenId); // Accessors function setBeneficiary(address _beneficiary) public onlyOwner { beneficiary = _beneficiary; } // Royalty percentage, initially set to 10% uint256 public royaltyPercentage = 10; function setRoyalties(address _royalties) public onlyOwner { royalties = _royalties; } // Set royalty percentage function setRoyaltyPercentage(uint256 _royaltyPercentage) public onlyOwner { require(_royaltyPercentage >= 0 && _royaltyPercentage <= 100, "Invalid royalty percentage"); royaltyPercentage = _royaltyPercentage; } function setPublicActive(bool _isActive) public onlyOwner { isActive = _isActive; } function setWLActive(bool _isWLActive) public onlyOwner { isWLActive = _isWLActive; } function totalSupply() public view returns (uint256) { return _currentId; } // Metadata function setMaxSupply(uint256 _maxSupply) public onlyOwner { require(_maxSupply > 0, "Max supply cannot be 0"); require(_maxSupply > _currentId, "Max supply cannot be less than current supply"); MAX_SUPPLY = _maxSupply; } function setBaseURI(string memory uri) public onlyOwner { baseURI = uri; } function _baseURI() internal view override returns (string memory) { return baseURI; } function contractURI() public view returns (string memory) { return _contractURI; } function setContractURI(string memory uri) public onlyOwner { _contractURI = uri; } // Minting // Whitelist Minting function mint(uint256 BatchId, uint256 amount, bool isWhitelisted) public payable nonReentrant { address sender = _msgSender(); require(!blacklistedAddresses[sender], "Transfer to a blacklisted address is not allowed"); require(Batchs[BatchId].isActive, "Batch is closed"); require(_currentId + amount <= MAX_SUPPLY, "Insufficient mints left"); require(msg.value == Batchs[BatchId].price * amount, "Incorrect payable amount"); if (isWLActive) { require(isWhitelisted, "Whitelist mint is not active"); require(whitelisted[BatchId][sender] >= amount, "Not allowed to mint this amount"); whitelisted[BatchId][sender] -= amount; } else { require(isActive, "Public mint is not active at the moment."); } uint256 SpotId = Batchs[BatchId].currentSupply + 1; _internalMint(sender, amount, BatchId, SpotId); } // Owner Minting function ownerMint(uint256 BatchId, uint256 amount) public onlyOwner nonReentrant { require(Batchs[BatchId].isActive, "Batch is closed"); require(_currentId + amount <= MAX_SUPPLY, "Insufficient mints left"); uint256 SpotId = Batchs[BatchId].currentSupply + 1; _internalMint(owner(), amount, BatchId, SpotId); } // Withdrawal function withdraw() public onlyOwner { uint256 balance = address(this).balance; uint256 royaltyAmount; uint256 beneficiaryAmount; // Check if royalty account address is the same as the beneficiary address if (royalties == beneficiary) { // Send everything to the beneficiary beneficiaryAmount = balance; } else { // Calculate the royalty based on the royalty percentage and the amount for the beneficiary royaltyAmount = balance * royaltyPercentage / 100; beneficiaryAmount = balance - royaltyAmount; payable(royalties).transfer(royaltyAmount); // Transfer royalty to the royalty account } payable(beneficiary).transfer(beneficiaryAmount); // Transfer the remaining amount to the beneficiary } // Disburse Abritrary Revenue To Token Owner function disburseRevenue(uint256 tokenId) public onlyOwner payable { address tokenOwner = ownerOf(tokenId); require(!blacklistedAddresses[tokenOwner], "Transfer to a blacklisted address is not allowed"); payable(tokenOwner).transfer(msg.value); } // Override Token URI Function function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); if (blacklistedTokens[tokenId]) { return string(abi.encodePacked(baseURI, "/blacklisted")); } uint256 batchId = batchOfToken[tokenId]; uint256 spotId; string memory batchName = Batchs[batchId].name; if (batchId == 1) { spotId = tokenId; } else { uint256 previousBatchesMaxSupply = 0; for (uint256 i = 1; i < batchId; i++) { previousBatchesMaxSupply += Batchs[i].maxSupply; } spotId = tokenId - previousBatchesMaxSupply; } return string(abi.encodePacked(baseURI, "/", batchName, "/", spotId.toString(), "/metadata.json")); } function checkTokensByOwner(address wallet) public view returns (bool, uint256[] memory) { uint256[] memory ownedTokens; uint256 tokenCount = 0; for (uint256 batchId = 1; batchId <= totalBatches; batchId++) { uint256 batchStartId = getBatchStartId(batchId); uint256 batchEndId = getBatchEndId(batchId); for (uint256 tokenId = batchStartId; tokenId <= batchEndId; tokenId++) { try this.ownerOf(tokenId) returns (address owner) { if (owner == wallet) { tokenCount++; // Resize the array and add the token ID ownedTokens = resizeAndAddToArray(ownedTokens, tokenId); } } catch { // Error occurred, continue to the next token ID } } } return (tokenCount > 0, ownedTokens); } function resizeAndAddToArray(uint256[] memory array, uint256 newElement) private pure returns (uint256[] memory) { uint256[] memory resizedArray = new uint256[](array.length + 1); for (uint256 i = 0; i < array.length; i++) { resizedArray[i] = array[i]; } resizedArray[array.length] = newElement; return resizedArray; } function getBatchStartId(uint256 batchId) private view returns (uint256) { uint256 previousBatchesMaxSupply = 0; for (uint256 i = 1; i < batchId; i++) { previousBatchesMaxSupply += Batchs[i].maxSupply; } return previousBatchesMaxSupply + 1; } function getBatchEndId(uint256 batchId) private view returns (uint256) { uint256 batchStartId = getBatchStartId(batchId); return batchStartId + Batchs[batchId].currentSupply - 1; } // Add Batch function addBatch(uint256 batchId, string memory batchName, uint256 maxSupply, uint256 price) public onlyOwner { require(batchId > 0, "Batch ID must be greater than 0"); // Calculate the total max supply after adding this batch uint256 newTotalMaxSupply = 0; for (uint256 i = 1; i < batchId; i++) { newTotalMaxSupply += Batchs[i].maxSupply; } newTotalMaxSupply += maxSupply; require(newTotalMaxSupply <= MAX_SUPPLY, "Adding this batch would exceed the max supply of the contract"); Batchs[batchId] = Batch(batchName, maxSupply, 0, price, false); totalBatches++; } // Set Batch to Active function setBatchActive(uint256 BatchId, bool _isActive) public onlyOwner { Batchs[BatchId].isActive = _isActive; } // Add functions to manage the whitelist // Add to Whitelist function addToWhitelist(uint256 BatchId, address user, uint256 amount) public onlyOwner { whitelisted[BatchId][user] = amount; } // Remove from Whitelist function removeFromWhitelist(uint256 BatchId, address user) public onlyOwner { delete whitelisted[BatchId][user]; } // Private // Internal Mint Function function _internalMint(address to, uint256 amount, uint256 BatchId, uint256 SpotId) private { require(BatchId > 0 && BatchId <= totalBatches, "Invalid BatchId"); require(_currentId + amount <= MAX_SUPPLY, "Will exceed maximum supply"); require(Batchs[BatchId].currentSupply + amount <= Batchs[BatchId].maxSupply, "Exceeds Batch maximum supply"); for (uint256 i = 0; i < amount; i++) { uint256 previousBatchesMaxSupply = 0; for (uint256 j = 1; j < BatchId; j++) { previousBatchesMaxSupply += Batchs[j].maxSupply; } uint256 tokenId = previousBatchesMaxSupply + SpotId + i; _safeMint(to, tokenId); batchOfToken[tokenId] = BatchId; string memory uri = tokenURI(tokenId); emit TokenURICreated(tokenId, uri); } _currentId += amount; Batchs[BatchId].currentSupply += amount; } // Add functions to manage the blacklist // Add to Blacklist function blacklistToken(uint256 tokenId) public onlyOwner { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); address tokenOwner = ownerOf(tokenId); require(tokenOwner != owner(), "Cannot blacklist the contract owner"); blacklistedTokens[tokenId] = true; blacklistedAddresses[tokenOwner] = true; string memory uri = tokenURI(tokenId); emit TokenURICreated(tokenId, uri); } // Reissue Blacklisted Token to Previous Owner function reissueBlacklistedToken(uint256 tokenId, address newOwner) public onlyOwner { require(blacklistedTokens[tokenId], "Token is not blacklisted"); blacklistedTokens[tokenId] = false; _transfer(ownerOf(tokenId), newOwner, tokenId); } // Remove from Blacklist function removeFromBlacklist(uint256 tokenId) public onlyOwner { require(blacklistedTokens[tokenId], "Token is not blacklisted"); blacklistedTokens[tokenId] = false; address tokenOwner = ownerOf(tokenId); blacklistedAddresses[tokenOwner] = false; emit TokenRemovedFromBlacklist(tokenId); } // Override Transfer Function function _transfer(address from, address to, uint256 tokenId) internal override { require(!blacklistedAddresses[to], "Transfer to a blacklisted address is not allowed"); super._transfer(from, to, tokenId); } // ERC165 function supportsInterface(bytes4 interfaceId) public view override(ERC721, IERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } // IERC2981 // Royalty function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view override returns (address, uint256 royaltyAmount) { _tokenId; // silence solc warning royaltyAmount = (_salePrice * royaltyPercentage) / 100; return (royalties, royaltyAmount); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.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 functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT // 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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @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; } }
// SPDX-License-Identifier: Unlicensed // OpenZeppelin Contracts (last updated v4.8.2) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./Address.sol"; import "./Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721A-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721A: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721A-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721A: invalid token ID"); return owner; } /** * @dev See {IERC721AMetadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721AMetadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721AMetadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); 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 overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721A-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721A: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721A: approve caller is not token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721A-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721A-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721A-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721A-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721A: caller is not token owner or approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721A-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721A-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721A: caller is not token owner or approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721AReceiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721A: transfer to non ERC721Receiver implementer"); } /** * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _ownerOf(tokenId) != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721AReceiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721AReceiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721A: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721A: mint to the zero address"); require(!_exists(tokenId), "ERC721A: token already minted"); _beforeTokenTransfer(address(0), to, tokenId, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721A: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721A: transfer from incorrect owner"); require(to != address(0), "ERC721A: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721A: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721A: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721A: invalid token ID"); } /** * @dev Internal function to invoke {IERC721AReceiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721A: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual {} /** * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override. * * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such * that `ownerOf(tokenId)` is `a`. */ // solhint-disable-next-line func-name-mixedcase function __unsafe_increaseBalance(address account, uint256 amount) internal { _balances[account] += amount; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @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`. * * 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; /** * @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 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * 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 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 the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (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 `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "./Context.sol"; /** * @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 Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { 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); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (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() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; import "./Math.sol"; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @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] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"address","name":"_royalties","type":"address"},{"internalType":"string","name":"_initialBaseURI","type":"string"},{"internalType":"string","name":"_initialContractURI","type":"string"}],"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":"uint256","name":"tokenId","type":"uint256"}],"name":"TokenRemovedFromBlacklist","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"uri","type":"string"}],"name":"TokenURICreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"Batchs","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"currentSupply","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"batchId","type":"uint256"},{"internalType":"string","name":"batchName","type":"string"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"addBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"BatchId","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowedMinters","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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"batchOfToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beneficiary","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"blacklistToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"blacklistedAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"blacklistedTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"checkTokensByOwner","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"disburseRevenue","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWLActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"BatchId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"isWhitelisted","type":"bool"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"BatchId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"reissueBlacklistedToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"removeFromBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"BatchId","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"removeFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royalties","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyPercentage","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"BatchId","type":"uint256"},{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setBatchActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"setBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setPublicActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_royalties","type":"address"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_royaltyPercentage","type":"uint256"}],"name":"setRoyaltyPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isWLActive","type":"bool"}],"name":"setWLActive","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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBatches","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"whitelisted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405262061a806008555f600d5f6101000a81548160ff0219169083151502179055505f600d60016101000a81548160ff021916908315150217905550600a6015553480156200004f575f80fd5b50604051620065473803806200654783398181016040528101906200007591906200048d565b6040518060400160405280601d81526020017f4e614d6f2044414f2041727468616e616772696b2050617373706f72740000008152506040518060400160405280600381526020017f4e4d4f0000000000000000000000000000000000000000000000000000000000815250815f9081620000f1919062000771565b50806001908162000103919062000771565b505050620001266200011a620001dd60201b60201c565b620001e460201b60201c565b600160078190555083600d60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600e5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600b9081620001c0919062000771565b5080600c9081620001d2919062000771565b505050505062000855565b5f33905090565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620002e382620002b8565b9050919050565b620002f581620002d7565b811462000300575f80fd5b50565b5f815190506200031381620002ea565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b620003698262000321565b810181811067ffffffffffffffff821117156200038b576200038a62000331565b5b80604052505050565b5f6200039f620002a7565b9050620003ad82826200035e565b919050565b5f67ffffffffffffffff821115620003cf57620003ce62000331565b5b620003da8262000321565b9050602081019050919050565b5f5b8381101562000406578082015181840152602081019050620003e9565b5f8484015250505050565b5f620004276200042184620003b2565b62000394565b9050828152602081018484840111156200044657620004456200031d565b5b62000453848285620003e7565b509392505050565b5f82601f83011262000472576200047162000319565b5b81516200048484826020860162000411565b91505092915050565b5f805f8060808587031215620004a857620004a7620002b0565b5b5f620004b78782880162000303565b9450506020620004ca8782880162000303565b935050604085015167ffffffffffffffff811115620004ee57620004ed620002b4565b5b620004fc878288016200045b565b925050606085015167ffffffffffffffff81111562000520576200051f620002b4565b5b6200052e878288016200045b565b91505092959194509250565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200058957607f821691505b6020821081036200059f576200059e62000544565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620006037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620005c6565b6200060f8683620005c6565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f62000659620006536200064d8462000627565b62000630565b62000627565b9050919050565b5f819050919050565b620006748362000639565b6200068c620006838262000660565b848454620005d2565b825550505050565b5f90565b620006a262000694565b620006af81848462000669565b505050565b5b81811015620006d657620006ca5f8262000698565b600181019050620006b5565b5050565b601f8211156200072557620006ef81620005a5565b620006fa84620005b7565b810160208510156200070a578190505b620007226200071985620005b7565b830182620006b4565b50505b505050565b5f82821c905092915050565b5f620007475f19846008026200072a565b1980831691505092915050565b5f62000761838362000736565b9150826002028217905092915050565b6200077c826200053a565b67ffffffffffffffff81111562000798576200079762000331565b5b620007a4825462000571565b620007b1828285620006da565b5f60209050601f831160018114620007e7575f8415620007d2578287015190505b620007de858262000754565b8655506200084d565b601f198416620007f786620005a5565b5f5b828110156200082057848901518255600182019150602085019450602081019050620007f9565b868310156200084057848901516200083c601f89168262000736565b8355505b6001600288020188555050505b505050505050565b615ce480620008635f395ff3fe6080604052600436106102fe575f3560e01c80636c0360eb1161018f578063a22cb465116100db578063e8a3d48511610094578063f053dc5c1161006e578063f053dc5c14610b7a578063f14b5bd614610ba4578063f2fde38b14610bcc578063fea3e61314610bf4576102fe565b8063e8a3d48514610aec578063e985e9c514610b16578063ea3e6a9914610b52576102fe565b8063a22cb465146109c0578063b88d4fde146109e8578063c87b56dd14610a10578063ca08444914610a4c578063d47573d414610a88578063d5749d4214610ab0576102fe565b80638a71bb2d11610148578063938e3d7b11610122578063938e3d7b1461091657806395d89b411461093e578063978a047b14610968578063a1d2119f146109a4576102fe565b80638a71bb2d1461089a5780638aca408c146108c45780638da5cb5b146108ec576102fe565b80636c0360eb146107915780636f8b44b0146107bb57806370a08231146107e3578063715018a61461081f578063838e3a7c14610835578063858f1aad1461085d576102fe565b80632a9e63c61161024e578063456bf1221161020757806361ba27da116101e157806361ba27da146106d95780636352211e1461070157806367ccec1e1461073d57806369ff6abb14610767576102fe565b8063456bf1221461065557806355f804b3146106955780635f4bb80b146106bd576102fe565b80632a9e63c61461056157806338af3eed146105895780633b305119146105b35780633ccfd60b146105db578063423afa66146105f157806342842e0e1461062d576102fe565b80631dede107116102bb57806322f3e2d41161029557806322f3e2d41461049657806323b872dd146104c057806328c56b99146104e85780632a55205a14610524576102fe565b80631dede1071461041e57806321c2dfea14610446578063227f7abe1461046e576102fe565b806301ffc9a71461030257806306fdde031461033e578063081812fc14610368578063095ea7b3146103a457806318160ddd146103cc5780631c31f710146103f6575b5f80fd5b34801561030d575f80fd5b5061032860048036038101906103239190613c79565b610c1c565b6040516103359190613cbe565b60405180910390f35b348015610349575f80fd5b50610352610c95565b60405161035f9190613d61565b60405180910390f35b348015610373575f80fd5b5061038e60048036038101906103899190613db4565b610d24565b60405161039b9190613e1e565b60405180910390f35b3480156103af575f80fd5b506103ca60048036038101906103c59190613e61565b610d66565b005b3480156103d7575f80fd5b506103e0610e7c565b6040516103ed9190613eae565b60405180910390f35b348015610401575f80fd5b5061041c60048036038101906104179190613ec7565b610e85565b005b348015610429575f80fd5b50610444600480360381019061043f9190613db4565b610ed1565b005b348015610451575f80fd5b5061046c60048036038101906104679190613ef2565b611069565b005b348015610479575f80fd5b50610494600480360381019061048f9190613f6c565b6110c7565b005b3480156104a1575f80fd5b506104aa6110ec565b6040516104b79190613cbe565b60405180910390f35b3480156104cb575f80fd5b506104e660048036038101906104e19190613f97565b6110fe565b005b3480156104f3575f80fd5b5061050e60048036038101906105099190613db4565b61115e565b60405161051b9190613cbe565b60405180910390f35b34801561052f575f80fd5b5061054a60048036038101906105459190613fe7565b61117b565b604051610558929190614025565b60405180910390f35b34801561056c575f80fd5b5061058760048036038101906105829190613ec7565b6111c4565b005b348015610594575f80fd5b5061059d61120f565b6040516105aa9190613e1e565b60405180910390f35b3480156105be575f80fd5b506105d960048036038101906105d4919061404c565b611235565b005b3480156105e6575f80fd5b506105ef61126c565b005b3480156105fc575f80fd5b5061061760048036038101906106129190613ec7565b6113f3565b6040516106249190613eae565b60405180910390f35b348015610638575f80fd5b50610653600480360381019061064e9190613f97565b611408565b005b348015610660575f80fd5b5061067b60048036038101906106769190613db4565b611427565b60405161068c95949392919061408a565b60405180910390f35b3480156106a0575f80fd5b506106bb60048036038101906106b6919061420e565b6114eb565b005b6106d760048036038101906106d29190614255565b611506565b005b3480156106e4575f80fd5b506106ff60048036038101906106fa9190613db4565b61188f565b005b34801561070c575f80fd5b5061072760048036038101906107229190613db4565b6118f1565b6040516107349190613e1e565b60405180910390f35b348015610748575f80fd5b50610751611975565b60405161075e9190613cbe565b60405180910390f35b348015610772575f80fd5b5061077b611988565b6040516107889190613eae565b60405180910390f35b34801561079c575f80fd5b506107a561198e565b6040516107b29190613d61565b60405180910390f35b3480156107c6575f80fd5b506107e160048036038101906107dc9190613db4565b611a1a565b005b3480156107ee575f80fd5b5061080960048036038101906108049190613ec7565b611ab2565b6040516108169190613eae565b60405180910390f35b34801561082a575f80fd5b50610833611b66565b005b348015610840575f80fd5b5061085b600480360381019061085691906142a5565b611b79565b005b348015610868575f80fd5b50610883600480360381019061087e9190613ec7565b611d07565b6040516108919291906143dc565b60405180910390f35b3480156108a5575f80fd5b506108ae611e40565b6040516108bb9190613eae565b60405180910390f35b3480156108cf575f80fd5b506108ea60048036038101906108e59190613f6c565b611e46565b005b3480156108f7575f80fd5b50610900611e6a565b60405161090d9190613e1e565b60405180910390f35b348015610921575f80fd5b5061093c6004803603810190610937919061420e565b611e92565b005b348015610949575f80fd5b50610952611ead565b60405161095f9190613d61565b60405180910390f35b348015610973575f80fd5b5061098e6004803603810190610989919061440a565b611f3d565b60405161099b9190613eae565b60405180910390f35b6109be60048036038101906109b99190613db4565b611f5d565b005b3480156109cb575f80fd5b506109e660048036038101906109e19190614448565b612043565b005b3480156109f3575f80fd5b50610a0e6004803603810190610a099190614524565b612059565b005b348015610a1b575f80fd5b50610a366004803603810190610a319190613db4565b6120bb565b604051610a439190613d61565b60405180910390f35b348015610a57575f80fd5b50610a726004803603810190610a6d9190613db4565b6122a0565b604051610a7f9190613eae565b60405180910390f35b348015610a93575f80fd5b50610aae6004803603810190610aa99190613fe7565b6122b5565b005b348015610abb575f80fd5b50610ad66004803603810190610ad19190613ec7565b6123bb565b604051610ae39190613cbe565b60405180910390f35b348015610af7575f80fd5b50610b006123d8565b604051610b0d9190613d61565b60405180910390f35b348015610b21575f80fd5b50610b3c6004803603810190610b3791906145a4565b612468565b604051610b499190613cbe565b60405180910390f35b348015610b5d575f80fd5b50610b786004803603810190610b73919061440a565b6124f6565b005b348015610b85575f80fd5b50610b8e61259a565b604051610b9b9190613e1e565b60405180910390f35b348015610baf575f80fd5b50610bca6004803603810190610bc59190613db4565b6125bf565b005b348015610bd7575f80fd5b50610bf26004803603810190610bed9190613ec7565b6126dd565b005b348015610bff575f80fd5b50610c1a6004803603810190610c15919061440a565b61275f565b005b5f7f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c8e5750610c8d826127ba565b5b9050919050565b60605f8054610ca39061460f565b80601f0160208091040260200160405190810160405280929190818152602001828054610ccf9061460f565b8015610d1a5780601f10610cf157610100808354040283529160200191610d1a565b820191905f5260205f20905b815481529060010190602001808311610cfd57829003601f168201915b5050505050905090565b5f610d2e8261289b565b60045f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f610d70826118f1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610de0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd7906146af565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610dff6128e6565b73ffffffffffffffffffffffffffffffffffffffff161480610e2e5750610e2d81610e286128e6565b612468565b5b610e6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e649061473d565b60405180910390fd5b610e7783836128ed565b505050565b5f600954905090565b610e8d6129a3565b80600d60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610ed96129a3565b610ee281612a21565b610f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f18906147cb565b60405180910390fd5b5f610f2b826118f1565b9050610f35611e6a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610fa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9990614859565b60405180910390fd5b600160135f8481526020019081526020015f205f6101000a81548160ff021916908315150217905550600160145f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505f61102a836120bb565b9050827f4c582017928a1bb7075268e9b0ab7e47ccf1bc5cb7638da3e8f97b3cdcc887e68260405161105c9190613d61565b60405180910390a2505050565b6110716129a3565b8060115f8581526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505050565b6110cf6129a3565b80600d60016101000a81548160ff02191690831515021790555050565b600d5f9054906101000a900460ff1681565b61110f6111096128e6565b82612a61565b61114e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611145906148e7565b60405180910390fd5b611159838383612af5565b505050565b6013602052805f5260405f205f915054906101000a900460ff1681565b5f8060646015548461118d9190614932565b61119791906149a0565b9050600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691509250929050565b6111cc6129a3565b80600e5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600d60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61123d6129a3565b8060105f8481526020019081526020015f206004015f6101000a81548160ff0219169083151502179055505050565b6112746129a3565b5f4790505f80600d60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036112f857829050611388565b6064601554846113089190614932565b61131291906149a0565b9150818361132091906149d0565b9050600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8390811502906040515f60405180830381858888f19350505050158015611386573d5f803e3d5ffd5b505b600d60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f193505050501580156113ed573d5f803e3d5ffd5b50505050565b600f602052805f5260405f205f915090505481565b61142283838360405180602001604052805f815250612059565b505050565b6010602052805f5260405f205f91509050805f0180546114469061460f565b80601f01602080910402602001604051908101604052809291908181526020018280546114729061460f565b80156114bd5780601f10611494576101008083540402835291602001916114bd565b820191905f5260205f20905b8154815290600101906020018083116114a057829003601f168201915b505050505090806001015490806002015490806003015490806004015f9054906101000a900460ff16905085565b6114f36129a3565b80600b90816115029190614ba0565b5050565b61150e612b8f565b5f6115176128e6565b905060145f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156115a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159a90614cdf565b60405180910390fd5b60105f8581526020019081526020015f206004015f9054906101000a900460ff16611603576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fa90614d47565b60405180910390fd5b600854836009546116149190614d65565b1115611655576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164c90614de2565b60405180910390fd5b8260105f8681526020019081526020015f20600301546116759190614932565b34146116b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ad90614e4a565b60405180910390fd5b600d60019054906101000a900460ff1615611801578161170b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170290614eb2565b60405180910390fd5b8260115f8681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054101561179a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179190614f1a565b60405180910390fd5b8260115f8681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546117f591906149d0565b92505081905550611850565b600d5f9054906101000a900460ff1661184f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184690614fa8565b60405180910390fd5b5b5f600160105f8781526020019081526020015f20600201546118729190614d65565b905061188082858784612bde565b505061188a612e22565b505050565b6118976129a3565b5f81101580156118a8575060648111155b6118e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118de90615010565b60405180910390fd5b8060158190555050565b5f806118fc83612e2c565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361196c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196390615078565b60405180910390fd5b80915050919050565b600d60019054906101000a900460ff1681565b600a5481565b600b805461199b9061460f565b80601f01602080910402602001604051908101604052809291908181526020018280546119c79061460f565b8015611a125780601f106119e957610100808354040283529160200191611a12565b820191905f5260205f20905b8154815290600101906020018083116119f557829003601f168201915b505050505081565b611a226129a3565b5f8111611a64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5b906150e0565b60405180910390fd5b6009548111611aa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9f9061516e565b60405180910390fd5b8060088190555050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b18906151fc565b60405180910390fd5b60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b611b6e6129a3565b611b775f612e65565b565b611b816129a3565b5f8411611bc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bba90615264565b60405180910390fd5b5f80600190505b85811015611c075760105f8281526020019081526020015f206001015482611bf29190614d65565b91508080611bff90615282565b915050611bca565b508281611c149190614d65565b9050600854811115611c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5290615339565b60405180910390fd5b6040518060a001604052808581526020018481526020015f81526020018381526020015f151581525060105f8781526020019081526020015f205f820151815f019081611ca89190614ba0565b506020820151816001015560408201518160020155606082015181600301556080820151816004015f6101000a81548160ff021916908315150217905550905050600a5f815480929190611cfb90615282565b91905055505050505050565b5f6060805f80600190505b600a548111611e30575f611d2582612f28565b90505f611d3183612f86565b90505f8290505b818111611e1a573073ffffffffffffffffffffffffffffffffffffffff16636352211e826040518263ffffffff1660e01b8152600401611d789190613eae565b602060405180830381865afa925050508015611db257506040513d601f19601f82011682018060405250810190611daf919061536b565b60015b15611e07578973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e05578580611df590615282565b965050611e028783612fc7565b96505b505b8080611e1290615282565b915050611d38565b5050508080611e2890615282565b915050611d12565b505f811182935093505050915091565b60155481565b611e4e6129a3565b80600d5f6101000a81548160ff02191690831515021790555050565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611e9a6129a3565b80600c9081611ea99190614ba0565b5050565b606060018054611ebc9061460f565b80601f0160208091040260200160405190810160405280929190818152602001828054611ee89061460f565b8015611f335780601f10611f0a57610100808354040283529160200191611f33565b820191905f5260205f20905b815481529060010190602001808311611f1657829003601f168201915b5050505050905090565b6011602052815f5260405f20602052805f5260405f205f91509150505481565b611f656129a3565b5f611f6f826118f1565b905060145f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615611ffb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff290614cdf565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc3490811502906040515f60405180830381858888f1935050505015801561203e573d5f803e3d5ffd5b505050565b61205561204e6128e6565b83836130a6565b5050565b61206a6120646128e6565b83612a61565b6120a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a0906148e7565b60405180910390fd5b6120b58484848461320d565b50505050565b60606120c682612a21565b612105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fc906147cb565b60405180910390fd5b60135f8381526020019081526020015f205f9054906101000a900460ff161561215057600b60405160200161213a919061546a565b604051602081830303815290604052905061229b565b5f60125f8481526020019081526020015f205490505f8060105f8481526020019081526020015f205f0180546121859061460f565b80601f01602080910402602001604051908101604052809291908181526020018280546121b19061460f565b80156121fc5780601f106121d3576101008083540402835291602001916121fc565b820191905f5260205f20905b8154815290600101906020018083116121df57829003601f168201915b505050505090506001830361221357849150612268565b5f80600190505b848110156122575760105f8281526020019081526020015f2060010154826122429190614d65565b9150808061224f90615282565b91505061221a565b50808661226491906149d0565b9250505b600b8161227484613269565b6040516020016122869392919061554f565b60405160208183030381529060405293505050505b919050565b6012602052805f5260405f205f915090505481565b6122bd6129a3565b6122c5612b8f565b60105f8381526020019081526020015f206004015f9054906101000a900460ff16612325576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231c90614d47565b60405180910390fd5b600854816009546123369190614d65565b1115612377576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236e90614de2565b60405180910390fd5b5f600160105f8581526020019081526020015f20600201546123999190614d65565b90506123ae6123a6611e6a565b838584612bde565b506123b7612e22565b5050565b6014602052805f5260405f205f915054906101000a900460ff1681565b6060600c80546123e79061460f565b80601f01602080910402602001604051908101604052809291908181526020018280546124139061460f565b801561245e5780601f106124355761010080835404028352916020019161245e565b820191905f5260205f20905b81548152906001019060200180831161244157829003601f168201915b5050505050905090565b5f60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b6124fe6129a3565b60135f8381526020019081526020015f205f9054906101000a900460ff1661255b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612552906155ea565b60405180910390fd5b5f60135f8481526020019081526020015f205f6101000a81548160ff02191690831515021790555061259661258f836118f1565b8284612af5565b5050565b600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6125c76129a3565b60135f8281526020019081526020015f205f9054906101000a900460ff16612624576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261b906155ea565b60405180910390fd5b5f60135f8381526020019081526020015f205f6101000a81548160ff0219169083151502179055505f612656826118f1565b90505f60145f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550817f3fe19a85ed8afb2bce4bea665515d954120221f6e4df37b1fd68d65501fd1fec60405160405180910390a25050565b6126e56129a3565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274a90615678565b60405180910390fd5b61275c81612e65565b50565b6127676129a3565b60115f8381526020019081526020015f205f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f90555050565b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061288457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612894575061289382613333565b5b9050919050565b6128a481612a21565b6128e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128da90615078565b60405180910390fd5b50565b5f33905090565b8160045f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661295d836118f1565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6129ab6128e6565b73ffffffffffffffffffffffffffffffffffffffff166129c9611e6a565b73ffffffffffffffffffffffffffffffffffffffff1614612a1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a16906156e0565b60405180910390fd5b565b5f8073ffffffffffffffffffffffffffffffffffffffff16612a4283612e2c565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b5f80612a6c836118f1565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612aae5750612aad8185612468565b5b80612aec57508373ffffffffffffffffffffffffffffffffffffffff16612ad484610d24565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b60145f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615612b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7690614cdf565b60405180910390fd5b612b8a83838361339c565b505050565b600260075403612bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bcb90615748565b60405180910390fd5b6002600781905550565b5f82118015612bef5750600a548211155b612c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c25906157b0565b60405180910390fd5b60085483600954612c3f9190614d65565b1115612c80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7790615818565b60405180910390fd5b60105f8381526020019081526020015f20600101548360105f8581526020019081526020015f2060020154612cb59190614d65565b1115612cf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ced90615880565b60405180910390fd5b5f5b83811015612dd9575f80600190505b84811015612d445760105f8281526020019081526020015f206001015482612d2f9190614d65565b91508080612d3c90615282565b915050612d07565b505f828483612d539190614d65565b612d5d9190614d65565b9050612d698782613688565b8460125f8381526020019081526020015f20819055505f612d89826120bb565b9050817f4c582017928a1bb7075268e9b0ab7e47ccf1bc5cb7638da3e8f97b3cdcc887e682604051612dbb9190613d61565b60405180910390a25050508080612dd190615282565b915050612cf8565b508260095f828254612deb9190614d65565b925050819055508260105f8481526020019081526020015f206002015f828254612e159190614d65565b9250508190555050505050565b6001600781905550565b5f60025f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f805f90505f600190505b83811015612f705760105f8281526020019081526020015f206001015482612f5b9190614d65565b91508080612f6890615282565b915050612f33565b50600181612f7e9190614d65565b915050919050565b5f80612f9183612f28565b9050600160105f8581526020019081526020015f206002015482612fb59190614d65565b612fbf91906149d0565b915050919050565b60605f60018451612fd89190614d65565b67ffffffffffffffff811115612ff157612ff06140ea565b5b60405190808252806020026020018201604052801561301f5781602001602082028036833780820191505090505b5090505f5b845181101561307a578481815181106130405761303f61589e565b5b602002602001015182828151811061305b5761305a61589e565b5b602002602001018181525050808061307290615282565b915050613024565b5082818551815181106130905761308f61589e565b5b6020026020010181815250508091505092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613114576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161310b90615915565b60405180910390fd5b8060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516132009190613cbe565b60405180910390a3505050565b613218848484612af5565b613224848484846136a5565b613263576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325a906159a3565b60405180910390fd5b50505050565b60605f600161327784613827565b0190505f8167ffffffffffffffff811115613295576132946140ea565b5b6040519080825280601f01601f1916602001820160405280156132c75781602001600182028036833780820191505090505b5090505f82602001820190505b600115613328578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161331d5761331c614973565b5b0494505f85036132d4575b819350505050919050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8273ffffffffffffffffffffffffffffffffffffffff166133bc826118f1565b73ffffffffffffffffffffffffffffffffffffffff1614613412576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161340990615a31565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613480576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161347790615abf565b60405180910390fd5b61348d8383836001613978565b8273ffffffffffffffffffffffffffffffffffffffff166134ad826118f1565b73ffffffffffffffffffffffffffffffffffffffff1614613503576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134fa90615a31565b60405180910390fd5b60045f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540392505081905550600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613683838383600161397e565b505050565b6136a1828260405180602001604052805f815250613984565b5050565b5f6136c58473ffffffffffffffffffffffffffffffffffffffff166139de565b1561381a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026136ee6128e6565b8786866040518563ffffffff1660e01b81526004016137109493929190615b2f565b6020604051808303815f875af192505050801561374b57506040513d601f19601f820116820180604052508101906137489190615b8d565b60015b6137ca573d805f8114613779576040519150601f19603f3d011682016040523d82523d5f602084013e61377e565b606091505b505f8151036137c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137b9906159a3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061381f565b600190505b949350505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613883577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161387957613878614973565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106138c0576d04ee2d6d415b85acef810000000083816138b6576138b5614973565b5b0492506020810190505b662386f26fc1000083106138ef57662386f26fc1000083816138e5576138e4614973565b5b0492506010810190505b6305f5e1008310613918576305f5e100838161390e5761390d614973565b5b0492506008810190505b612710831061393d57612710838161393357613932614973565b5b0492506004810190505b60648310613960576064838161395657613955614973565b5b0492506002810190505b600a831061396f576001810190505b80915050919050565b50505050565b50505050565b61398e8383613a00565b61399a5f8484846136a5565b6139d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139d0906159a3565b60405180910390fd5b505050565b5f808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613a6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a6590615c28565b60405180910390fd5b613a7781612a21565b15613ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613aae90615c90565b60405180910390fd5b613ac45f83836001613978565b613acd81612a21565b15613b0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b0490615c90565b60405180910390fd5b600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613c0f5f8383600161397e565b5050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613c5881613c24565b8114613c62575f80fd5b50565b5f81359050613c7381613c4f565b92915050565b5f60208284031215613c8e57613c8d613c1c565b5b5f613c9b84828501613c65565b91505092915050565b5f8115159050919050565b613cb881613ca4565b82525050565b5f602082019050613cd15f830184613caf565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613d0e578082015181840152602081019050613cf3565b5f8484015250505050565b5f601f19601f8301169050919050565b5f613d3382613cd7565b613d3d8185613ce1565b9350613d4d818560208601613cf1565b613d5681613d19565b840191505092915050565b5f6020820190508181035f830152613d798184613d29565b905092915050565b5f819050919050565b613d9381613d81565b8114613d9d575f80fd5b50565b5f81359050613dae81613d8a565b92915050565b5f60208284031215613dc957613dc8613c1c565b5b5f613dd684828501613da0565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613e0882613ddf565b9050919050565b613e1881613dfe565b82525050565b5f602082019050613e315f830184613e0f565b92915050565b613e4081613dfe565b8114613e4a575f80fd5b50565b5f81359050613e5b81613e37565b92915050565b5f8060408385031215613e7757613e76613c1c565b5b5f613e8485828601613e4d565b9250506020613e9585828601613da0565b9150509250929050565b613ea881613d81565b82525050565b5f602082019050613ec15f830184613e9f565b92915050565b5f60208284031215613edc57613edb613c1c565b5b5f613ee984828501613e4d565b91505092915050565b5f805f60608486031215613f0957613f08613c1c565b5b5f613f1686828701613da0565b9350506020613f2786828701613e4d565b9250506040613f3886828701613da0565b9150509250925092565b613f4b81613ca4565b8114613f55575f80fd5b50565b5f81359050613f6681613f42565b92915050565b5f60208284031215613f8157613f80613c1c565b5b5f613f8e84828501613f58565b91505092915050565b5f805f60608486031215613fae57613fad613c1c565b5b5f613fbb86828701613e4d565b9350506020613fcc86828701613e4d565b9250506040613fdd86828701613da0565b9150509250925092565b5f8060408385031215613ffd57613ffc613c1c565b5b5f61400a85828601613da0565b925050602061401b85828601613da0565b9150509250929050565b5f6040820190506140385f830185613e0f565b6140456020830184613e9f565b9392505050565b5f806040838503121561406257614061613c1c565b5b5f61406f85828601613da0565b925050602061408085828601613f58565b9150509250929050565b5f60a0820190508181035f8301526140a28188613d29565b90506140b16020830187613e9f565b6140be6040830186613e9f565b6140cb6060830185613e9f565b6140d86080830184613caf565b9695505050505050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61412082613d19565b810181811067ffffffffffffffff8211171561413f5761413e6140ea565b5b80604052505050565b5f614151613c13565b905061415d8282614117565b919050565b5f67ffffffffffffffff82111561417c5761417b6140ea565b5b61418582613d19565b9050602081019050919050565b828183375f83830152505050565b5f6141b26141ad84614162565b614148565b9050828152602081018484840111156141ce576141cd6140e6565b5b6141d9848285614192565b509392505050565b5f82601f8301126141f5576141f46140e2565b5b81356142058482602086016141a0565b91505092915050565b5f6020828403121561422357614222613c1c565b5b5f82013567ffffffffffffffff8111156142405761423f613c20565b5b61424c848285016141e1565b91505092915050565b5f805f6060848603121561426c5761426b613c1c565b5b5f61427986828701613da0565b935050602061428a86828701613da0565b925050604061429b86828701613f58565b9150509250925092565b5f805f80608085870312156142bd576142bc613c1c565b5b5f6142ca87828801613da0565b945050602085013567ffffffffffffffff8111156142eb576142ea613c20565b5b6142f7878288016141e1565b935050604061430887828801613da0565b925050606061431987828801613da0565b91505092959194509250565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61435781613d81565b82525050565b5f614368838361434e565b60208301905092915050565b5f602082019050919050565b5f61438a82614325565b614394818561432f565b935061439f8361433f565b805f5b838110156143cf5781516143b6888261435d565b97506143c183614374565b9250506001810190506143a2565b5085935050505092915050565b5f6040820190506143ef5f830185613caf565b81810360208301526144018184614380565b90509392505050565b5f80604083850312156144205761441f613c1c565b5b5f61442d85828601613da0565b925050602061443e85828601613e4d565b9150509250929050565b5f806040838503121561445e5761445d613c1c565b5b5f61446b85828601613e4d565b925050602061447c85828601613f58565b9150509250929050565b5f67ffffffffffffffff8211156144a05761449f6140ea565b5b6144a982613d19565b9050602081019050919050565b5f6144c86144c384614486565b614148565b9050828152602081018484840111156144e4576144e36140e6565b5b6144ef848285614192565b509392505050565b5f82601f83011261450b5761450a6140e2565b5b813561451b8482602086016144b6565b91505092915050565b5f805f806080858703121561453c5761453b613c1c565b5b5f61454987828801613e4d565b945050602061455a87828801613e4d565b935050604061456b87828801613da0565b925050606085013567ffffffffffffffff81111561458c5761458b613c20565b5b614598878288016144f7565b91505092959194509250565b5f80604083850312156145ba576145b9613c1c565b5b5f6145c785828601613e4d565b92505060206145d885828601613e4d565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061462657607f821691505b602082108103614639576146386145e2565b5b50919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e5f8201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b5f614699602283613ce1565b91506146a48261463f565b604082019050919050565b5f6020820190508181035f8301526146c68161468d565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f7420745f8201527f6f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000602082015250565b5f614727603e83613ce1565b9150614732826146cd565b604082019050919050565b5f6020820190508181035f8301526147548161471b565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f5f8201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b5f6147b5602f83613ce1565b91506147c08261475b565b604082019050919050565b5f6020820190508181035f8301526147e2816147a9565b9050919050565b7f43616e6e6f7420626c61636b6c6973742074686520636f6e7472616374206f775f8201527f6e65720000000000000000000000000000000000000000000000000000000000602082015250565b5f614843602383613ce1565b915061484e826147e9565b604082019050919050565b5f6020820190508181035f83015261487081614837565b9050919050565b7f455243373231413a2063616c6c6572206973206e6f7420746f6b656e206f776e5f8201527f6572206f7220617070726f766564000000000000000000000000000000000000602082015250565b5f6148d1602e83613ce1565b91506148dc82614877565b604082019050919050565b5f6020820190508181035f8301526148fe816148c5565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61493c82613d81565b915061494783613d81565b925082820261495581613d81565b9150828204841483151761496c5761496b614905565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6149aa82613d81565b91506149b583613d81565b9250826149c5576149c4614973565b5b828204905092915050565b5f6149da82613d81565b91506149e583613d81565b92508282039050818111156149fd576149fc614905565b5b92915050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302614a5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614a24565b614a698683614a24565b95508019841693508086168417925050509392505050565b5f819050919050565b5f614aa4614a9f614a9a84613d81565b614a81565b613d81565b9050919050565b5f819050919050565b614abd83614a8a565b614ad1614ac982614aab565b848454614a30565b825550505050565b5f90565b614ae5614ad9565b614af0818484614ab4565b505050565b5b81811015614b1357614b085f82614add565b600181019050614af6565b5050565b601f821115614b5857614b2981614a03565b614b3284614a15565b81016020851015614b41578190505b614b55614b4d85614a15565b830182614af5565b50505b505050565b5f82821c905092915050565b5f614b785f1984600802614b5d565b1980831691505092915050565b5f614b908383614b69565b9150826002028217905092915050565b614ba982613cd7565b67ffffffffffffffff811115614bc257614bc16140ea565b5b614bcc825461460f565b614bd7828285614b17565b5f60209050601f831160018114614c08575f8415614bf6578287015190505b614c008582614b85565b865550614c67565b601f198416614c1686614a03565b5f5b82811015614c3d57848901518255600182019150602085019450602081019050614c18565b86831015614c5a5784890151614c56601f891682614b69565b8355505b6001600288020188555050505b505050505050565b7f5472616e7366657220746f206120626c61636b6c6973746564206164647265735f8201527f73206973206e6f7420616c6c6f77656400000000000000000000000000000000602082015250565b5f614cc9603083613ce1565b9150614cd482614c6f565b604082019050919050565b5f6020820190508181035f830152614cf681614cbd565b9050919050565b7f426174636820697320636c6f73656400000000000000000000000000000000005f82015250565b5f614d31600f83613ce1565b9150614d3c82614cfd565b602082019050919050565b5f6020820190508181035f830152614d5e81614d25565b9050919050565b5f614d6f82613d81565b9150614d7a83613d81565b9250828201905080821115614d9257614d91614905565b5b92915050565b7f496e73756666696369656e74206d696e7473206c6566740000000000000000005f82015250565b5f614dcc601783613ce1565b9150614dd782614d98565b602082019050919050565b5f6020820190508181035f830152614df981614dc0565b9050919050565b7f496e636f72726563742070617961626c6520616d6f756e7400000000000000005f82015250565b5f614e34601883613ce1565b9150614e3f82614e00565b602082019050919050565b5f6020820190508181035f830152614e6181614e28565b9050919050565b7f57686974656c697374206d696e74206973206e6f7420616374697665000000005f82015250565b5f614e9c601c83613ce1565b9150614ea782614e68565b602082019050919050565b5f6020820190508181035f830152614ec981614e90565b9050919050565b7f4e6f7420616c6c6f77656420746f206d696e74207468697320616d6f756e74005f82015250565b5f614f04601f83613ce1565b9150614f0f82614ed0565b602082019050919050565b5f6020820190508181035f830152614f3181614ef8565b9050919050565b7f5075626c6963206d696e74206973206e6f7420616374697665206174207468655f8201527f206d6f6d656e742e000000000000000000000000000000000000000000000000602082015250565b5f614f92602883613ce1565b9150614f9d82614f38565b604082019050919050565b5f6020820190508181035f830152614fbf81614f86565b9050919050565b7f496e76616c696420726f79616c74792070657263656e746167650000000000005f82015250565b5f614ffa601a83613ce1565b915061500582614fc6565b602082019050919050565b5f6020820190508181035f83015261502781614fee565b9050919050565b7f455243373231413a20696e76616c696420746f6b656e204944000000000000005f82015250565b5f615062601983613ce1565b915061506d8261502e565b602082019050919050565b5f6020820190508181035f83015261508f81615056565b9050919050565b7f4d617820737570706c792063616e6e6f742062652030000000000000000000005f82015250565b5f6150ca601683613ce1565b91506150d582615096565b602082019050919050565b5f6020820190508181035f8301526150f7816150be565b9050919050565b7f4d617820737570706c792063616e6e6f74206265206c657373207468616e20635f8201527f757272656e7420737570706c7900000000000000000000000000000000000000602082015250565b5f615158602d83613ce1565b9150615163826150fe565b604082019050919050565b5f6020820190508181035f8301526151858161514c565b9050919050565b7f455243373231413a2061646472657373207a65726f206973206e6f74206120765f8201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b5f6151e6602a83613ce1565b91506151f18261518c565b604082019050919050565b5f6020820190508181035f830152615213816151da565b9050919050565b7f4261746368204944206d7573742062652067726561746572207468616e2030005f82015250565b5f61524e601f83613ce1565b91506152598261521a565b602082019050919050565b5f6020820190508181035f83015261527b81615242565b9050919050565b5f61528c82613d81565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036152be576152bd614905565b5b600182019050919050565b7f416464696e67207468697320626174636820776f756c642065786365656420745f8201527f6865206d617820737570706c79206f662074686520636f6e7472616374000000602082015250565b5f615323603d83613ce1565b915061532e826152c9565b604082019050919050565b5f6020820190508181035f83015261535081615317565b9050919050565b5f8151905061536581613e37565b92915050565b5f602082840312156153805761537f613c1c565b5b5f61538d84828501615357565b91505092915050565b5f81905092915050565b5f81546153ac8161460f565b6153b68186615396565b9450600182165f81146153d057600181146153e557615417565b60ff1983168652811515820286019350615417565b6153ee85614a03565b5f5b8381101561540f578154818901526001820191506020810190506153f0565b838801955050505b50505092915050565b7f2f626c61636b6c697374656400000000000000000000000000000000000000005f82015250565b5f615454600c83615396565b915061545f82615420565b600c82019050919050565b5f61547582846153a0565b915061548082615448565b915081905092915050565b7f2f000000000000000000000000000000000000000000000000000000000000005f82015250565b5f6154bf600183615396565b91506154ca8261548b565b600182019050919050565b5f6154df82613cd7565b6154e98185615396565b93506154f9818560208601613cf1565b80840191505092915050565b7f2f6d657461646174612e6a736f6e0000000000000000000000000000000000005f82015250565b5f615539600e83615396565b915061554482615505565b600e82019050919050565b5f61555a82866153a0565b9150615565826154b3565b915061557182856154d5565b915061557c826154b3565b915061558882846154d5565b91506155938261552d565b9150819050949350505050565b7f546f6b656e206973206e6f7420626c61636b6c697374656400000000000000005f82015250565b5f6155d4601883613ce1565b91506155df826155a0565b602082019050919050565b5f6020820190508181035f830152615601816155c8565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f615662602683613ce1565b915061566d82615608565b604082019050919050565b5f6020820190508181035f83015261568f81615656565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6156ca602083613ce1565b91506156d582615696565b602082019050919050565b5f6020820190508181035f8301526156f7816156be565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f615732601f83613ce1565b915061573d826156fe565b602082019050919050565b5f6020820190508181035f83015261575f81615726565b9050919050565b7f496e76616c6964204261746368496400000000000000000000000000000000005f82015250565b5f61579a600f83613ce1565b91506157a582615766565b602082019050919050565b5f6020820190508181035f8301526157c78161578e565b9050919050565b7f57696c6c20657863656564206d6178696d756d20737570706c790000000000005f82015250565b5f615802601a83613ce1565b915061580d826157ce565b602082019050919050565b5f6020820190508181035f83015261582f816157f6565b9050919050565b7f45786365656473204261746368206d6178696d756d20737570706c79000000005f82015250565b5f61586a601c83613ce1565b915061587582615836565b602082019050919050565b5f6020820190508181035f8301526158978161585e565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f455243373231413a20617070726f766520746f2063616c6c65720000000000005f82015250565b5f6158ff601a83613ce1565b915061590a826158cb565b602082019050919050565b5f6020820190508181035f83015261592c816158f3565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e20455243373231525f8201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b5f61598d603383613ce1565b915061599882615933565b604082019050919050565b5f6020820190508181035f8301526159ba81615981565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f72726563745f8201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b5f615a1b602683613ce1565b9150615a26826159c1565b604082019050919050565b5f6020820190508181035f830152615a4881615a0f565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f615aa9602583613ce1565b9150615ab482615a4f565b604082019050919050565b5f6020820190508181035f830152615ad681615a9d565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f615b0182615add565b615b0b8185615ae7565b9350615b1b818560208601613cf1565b615b2481613d19565b840191505092915050565b5f608082019050615b425f830187613e0f565b615b4f6020830186613e0f565b615b5c6040830185613e9f565b8181036060830152615b6e8184615af7565b905095945050505050565b5f81519050615b8781613c4f565b92915050565b5f60208284031215615ba257615ba1613c1c565b5b5f615baf84828501615b79565b91505092915050565b7f455243373231413a206d696e7420746f20746865207a65726f206164647265735f8201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b5f615c12602183613ce1565b9150615c1d82615bb8565b604082019050919050565b5f6020820190508181035f830152615c3f81615c06565b9050919050565b7f455243373231413a20746f6b656e20616c7265616479206d696e7465640000005f82015250565b5f615c7a601d83613ce1565b9150615c8582615c46565b602082019050919050565b5f6020820190508181035f830152615ca781615c6e565b905091905056fea264697066735822122027b63808d3b579d1446f03352b01c7849ccd69b1cfd77a44024d22d6050d01e564736f6c63430008150033000000000000000000000000efc7f585a155f673310832c064833c87edb9dd55000000000000000000000000efc7f585a155f673310832c064833c87edb9dd55000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000002468747470733a2f2f6e616d6f2e61727468616e656574692e6f72672f6d6574616461746100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002468747470733a2f2f6e616d6f2e61727468616e656574692e6f72672f636f6e747261637400000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102fe575f3560e01c80636c0360eb1161018f578063a22cb465116100db578063e8a3d48511610094578063f053dc5c1161006e578063f053dc5c14610b7a578063f14b5bd614610ba4578063f2fde38b14610bcc578063fea3e61314610bf4576102fe565b8063e8a3d48514610aec578063e985e9c514610b16578063ea3e6a9914610b52576102fe565b8063a22cb465146109c0578063b88d4fde146109e8578063c87b56dd14610a10578063ca08444914610a4c578063d47573d414610a88578063d5749d4214610ab0576102fe565b80638a71bb2d11610148578063938e3d7b11610122578063938e3d7b1461091657806395d89b411461093e578063978a047b14610968578063a1d2119f146109a4576102fe565b80638a71bb2d1461089a5780638aca408c146108c45780638da5cb5b146108ec576102fe565b80636c0360eb146107915780636f8b44b0146107bb57806370a08231146107e3578063715018a61461081f578063838e3a7c14610835578063858f1aad1461085d576102fe565b80632a9e63c61161024e578063456bf1221161020757806361ba27da116101e157806361ba27da146106d95780636352211e1461070157806367ccec1e1461073d57806369ff6abb14610767576102fe565b8063456bf1221461065557806355f804b3146106955780635f4bb80b146106bd576102fe565b80632a9e63c61461056157806338af3eed146105895780633b305119146105b35780633ccfd60b146105db578063423afa66146105f157806342842e0e1461062d576102fe565b80631dede107116102bb57806322f3e2d41161029557806322f3e2d41461049657806323b872dd146104c057806328c56b99146104e85780632a55205a14610524576102fe565b80631dede1071461041e57806321c2dfea14610446578063227f7abe1461046e576102fe565b806301ffc9a71461030257806306fdde031461033e578063081812fc14610368578063095ea7b3146103a457806318160ddd146103cc5780631c31f710146103f6575b5f80fd5b34801561030d575f80fd5b5061032860048036038101906103239190613c79565b610c1c565b6040516103359190613cbe565b60405180910390f35b348015610349575f80fd5b50610352610c95565b60405161035f9190613d61565b60405180910390f35b348015610373575f80fd5b5061038e60048036038101906103899190613db4565b610d24565b60405161039b9190613e1e565b60405180910390f35b3480156103af575f80fd5b506103ca60048036038101906103c59190613e61565b610d66565b005b3480156103d7575f80fd5b506103e0610e7c565b6040516103ed9190613eae565b60405180910390f35b348015610401575f80fd5b5061041c60048036038101906104179190613ec7565b610e85565b005b348015610429575f80fd5b50610444600480360381019061043f9190613db4565b610ed1565b005b348015610451575f80fd5b5061046c60048036038101906104679190613ef2565b611069565b005b348015610479575f80fd5b50610494600480360381019061048f9190613f6c565b6110c7565b005b3480156104a1575f80fd5b506104aa6110ec565b6040516104b79190613cbe565b60405180910390f35b3480156104cb575f80fd5b506104e660048036038101906104e19190613f97565b6110fe565b005b3480156104f3575f80fd5b5061050e60048036038101906105099190613db4565b61115e565b60405161051b9190613cbe565b60405180910390f35b34801561052f575f80fd5b5061054a60048036038101906105459190613fe7565b61117b565b604051610558929190614025565b60405180910390f35b34801561056c575f80fd5b5061058760048036038101906105829190613ec7565b6111c4565b005b348015610594575f80fd5b5061059d61120f565b6040516105aa9190613e1e565b60405180910390f35b3480156105be575f80fd5b506105d960048036038101906105d4919061404c565b611235565b005b3480156105e6575f80fd5b506105ef61126c565b005b3480156105fc575f80fd5b5061061760048036038101906106129190613ec7565b6113f3565b6040516106249190613eae565b60405180910390f35b348015610638575f80fd5b50610653600480360381019061064e9190613f97565b611408565b005b348015610660575f80fd5b5061067b60048036038101906106769190613db4565b611427565b60405161068c95949392919061408a565b60405180910390f35b3480156106a0575f80fd5b506106bb60048036038101906106b6919061420e565b6114eb565b005b6106d760048036038101906106d29190614255565b611506565b005b3480156106e4575f80fd5b506106ff60048036038101906106fa9190613db4565b61188f565b005b34801561070c575f80fd5b5061072760048036038101906107229190613db4565b6118f1565b6040516107349190613e1e565b60405180910390f35b348015610748575f80fd5b50610751611975565b60405161075e9190613cbe565b60405180910390f35b348015610772575f80fd5b5061077b611988565b6040516107889190613eae565b60405180910390f35b34801561079c575f80fd5b506107a561198e565b6040516107b29190613d61565b60405180910390f35b3480156107c6575f80fd5b506107e160048036038101906107dc9190613db4565b611a1a565b005b3480156107ee575f80fd5b5061080960048036038101906108049190613ec7565b611ab2565b6040516108169190613eae565b60405180910390f35b34801561082a575f80fd5b50610833611b66565b005b348015610840575f80fd5b5061085b600480360381019061085691906142a5565b611b79565b005b348015610868575f80fd5b50610883600480360381019061087e9190613ec7565b611d07565b6040516108919291906143dc565b60405180910390f35b3480156108a5575f80fd5b506108ae611e40565b6040516108bb9190613eae565b60405180910390f35b3480156108cf575f80fd5b506108ea60048036038101906108e59190613f6c565b611e46565b005b3480156108f7575f80fd5b50610900611e6a565b60405161090d9190613e1e565b60405180910390f35b348015610921575f80fd5b5061093c6004803603810190610937919061420e565b611e92565b005b348015610949575f80fd5b50610952611ead565b60405161095f9190613d61565b60405180910390f35b348015610973575f80fd5b5061098e6004803603810190610989919061440a565b611f3d565b60405161099b9190613eae565b60405180910390f35b6109be60048036038101906109b99190613db4565b611f5d565b005b3480156109cb575f80fd5b506109e660048036038101906109e19190614448565b612043565b005b3480156109f3575f80fd5b50610a0e6004803603810190610a099190614524565b612059565b005b348015610a1b575f80fd5b50610a366004803603810190610a319190613db4565b6120bb565b604051610a439190613d61565b60405180910390f35b348015610a57575f80fd5b50610a726004803603810190610a6d9190613db4565b6122a0565b604051610a7f9190613eae565b60405180910390f35b348015610a93575f80fd5b50610aae6004803603810190610aa99190613fe7565b6122b5565b005b348015610abb575f80fd5b50610ad66004803603810190610ad19190613ec7565b6123bb565b604051610ae39190613cbe565b60405180910390f35b348015610af7575f80fd5b50610b006123d8565b604051610b0d9190613d61565b60405180910390f35b348015610b21575f80fd5b50610b3c6004803603810190610b3791906145a4565b612468565b604051610b499190613cbe565b60405180910390f35b348015610b5d575f80fd5b50610b786004803603810190610b73919061440a565b6124f6565b005b348015610b85575f80fd5b50610b8e61259a565b604051610b9b9190613e1e565b60405180910390f35b348015610baf575f80fd5b50610bca6004803603810190610bc59190613db4565b6125bf565b005b348015610bd7575f80fd5b50610bf26004803603810190610bed9190613ec7565b6126dd565b005b348015610bff575f80fd5b50610c1a6004803603810190610c15919061440a565b61275f565b005b5f7f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c8e5750610c8d826127ba565b5b9050919050565b60605f8054610ca39061460f565b80601f0160208091040260200160405190810160405280929190818152602001828054610ccf9061460f565b8015610d1a5780601f10610cf157610100808354040283529160200191610d1a565b820191905f5260205f20905b815481529060010190602001808311610cfd57829003601f168201915b5050505050905090565b5f610d2e8261289b565b60045f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f610d70826118f1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610de0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd7906146af565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610dff6128e6565b73ffffffffffffffffffffffffffffffffffffffff161480610e2e5750610e2d81610e286128e6565b612468565b5b610e6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e649061473d565b60405180910390fd5b610e7783836128ed565b505050565b5f600954905090565b610e8d6129a3565b80600d60026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610ed96129a3565b610ee281612a21565b610f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f18906147cb565b60405180910390fd5b5f610f2b826118f1565b9050610f35611e6a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610fa2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9990614859565b60405180910390fd5b600160135f8481526020019081526020015f205f6101000a81548160ff021916908315150217905550600160145f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505f61102a836120bb565b9050827f4c582017928a1bb7075268e9b0ab7e47ccf1bc5cb7638da3e8f97b3cdcc887e68260405161105c9190613d61565b60405180910390a2505050565b6110716129a3565b8060115f8581526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505050565b6110cf6129a3565b80600d60016101000a81548160ff02191690831515021790555050565b600d5f9054906101000a900460ff1681565b61110f6111096128e6565b82612a61565b61114e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611145906148e7565b60405180910390fd5b611159838383612af5565b505050565b6013602052805f5260405f205f915054906101000a900460ff1681565b5f8060646015548461118d9190614932565b61119791906149a0565b9050600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691509250929050565b6111cc6129a3565b80600e5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600d60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61123d6129a3565b8060105f8481526020019081526020015f206004015f6101000a81548160ff0219169083151502179055505050565b6112746129a3565b5f4790505f80600d60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036112f857829050611388565b6064601554846113089190614932565b61131291906149a0565b9150818361132091906149d0565b9050600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8390811502906040515f60405180830381858888f19350505050158015611386573d5f803e3d5ffd5b505b600d60029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f193505050501580156113ed573d5f803e3d5ffd5b50505050565b600f602052805f5260405f205f915090505481565b61142283838360405180602001604052805f815250612059565b505050565b6010602052805f5260405f205f91509050805f0180546114469061460f565b80601f01602080910402602001604051908101604052809291908181526020018280546114729061460f565b80156114bd5780601f10611494576101008083540402835291602001916114bd565b820191905f5260205f20905b8154815290600101906020018083116114a057829003601f168201915b505050505090806001015490806002015490806003015490806004015f9054906101000a900460ff16905085565b6114f36129a3565b80600b90816115029190614ba0565b5050565b61150e612b8f565b5f6115176128e6565b905060145f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156115a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159a90614cdf565b60405180910390fd5b60105f8581526020019081526020015f206004015f9054906101000a900460ff16611603576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fa90614d47565b60405180910390fd5b600854836009546116149190614d65565b1115611655576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164c90614de2565b60405180910390fd5b8260105f8681526020019081526020015f20600301546116759190614932565b34146116b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ad90614e4a565b60405180910390fd5b600d60019054906101000a900460ff1615611801578161170b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170290614eb2565b60405180910390fd5b8260115f8681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054101561179a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179190614f1a565b60405180910390fd5b8260115f8681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546117f591906149d0565b92505081905550611850565b600d5f9054906101000a900460ff1661184f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184690614fa8565b60405180910390fd5b5b5f600160105f8781526020019081526020015f20600201546118729190614d65565b905061188082858784612bde565b505061188a612e22565b505050565b6118976129a3565b5f81101580156118a8575060648111155b6118e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118de90615010565b60405180910390fd5b8060158190555050565b5f806118fc83612e2c565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361196c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196390615078565b60405180910390fd5b80915050919050565b600d60019054906101000a900460ff1681565b600a5481565b600b805461199b9061460f565b80601f01602080910402602001604051908101604052809291908181526020018280546119c79061460f565b8015611a125780601f106119e957610100808354040283529160200191611a12565b820191905f5260205f20905b8154815290600101906020018083116119f557829003601f168201915b505050505081565b611a226129a3565b5f8111611a64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5b906150e0565b60405180910390fd5b6009548111611aa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9f9061516e565b60405180910390fd5b8060088190555050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b18906151fc565b60405180910390fd5b60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b611b6e6129a3565b611b775f612e65565b565b611b816129a3565b5f8411611bc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bba90615264565b60405180910390fd5b5f80600190505b85811015611c075760105f8281526020019081526020015f206001015482611bf29190614d65565b91508080611bff90615282565b915050611bca565b508281611c149190614d65565b9050600854811115611c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5290615339565b60405180910390fd5b6040518060a001604052808581526020018481526020015f81526020018381526020015f151581525060105f8781526020019081526020015f205f820151815f019081611ca89190614ba0565b506020820151816001015560408201518160020155606082015181600301556080820151816004015f6101000a81548160ff021916908315150217905550905050600a5f815480929190611cfb90615282565b91905055505050505050565b5f6060805f80600190505b600a548111611e30575f611d2582612f28565b90505f611d3183612f86565b90505f8290505b818111611e1a573073ffffffffffffffffffffffffffffffffffffffff16636352211e826040518263ffffffff1660e01b8152600401611d789190613eae565b602060405180830381865afa925050508015611db257506040513d601f19601f82011682018060405250810190611daf919061536b565b60015b15611e07578973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e05578580611df590615282565b965050611e028783612fc7565b96505b505b8080611e1290615282565b915050611d38565b5050508080611e2890615282565b915050611d12565b505f811182935093505050915091565b60155481565b611e4e6129a3565b80600d5f6101000a81548160ff02191690831515021790555050565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611e9a6129a3565b80600c9081611ea99190614ba0565b5050565b606060018054611ebc9061460f565b80601f0160208091040260200160405190810160405280929190818152602001828054611ee89061460f565b8015611f335780601f10611f0a57610100808354040283529160200191611f33565b820191905f5260205f20905b815481529060010190602001808311611f1657829003601f168201915b5050505050905090565b6011602052815f5260405f20602052805f5260405f205f91509150505481565b611f656129a3565b5f611f6f826118f1565b905060145f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615611ffb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff290614cdf565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc3490811502906040515f60405180830381858888f1935050505015801561203e573d5f803e3d5ffd5b505050565b61205561204e6128e6565b83836130a6565b5050565b61206a6120646128e6565b83612a61565b6120a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a0906148e7565b60405180910390fd5b6120b58484848461320d565b50505050565b60606120c682612a21565b612105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fc906147cb565b60405180910390fd5b60135f8381526020019081526020015f205f9054906101000a900460ff161561215057600b60405160200161213a919061546a565b604051602081830303815290604052905061229b565b5f60125f8481526020019081526020015f205490505f8060105f8481526020019081526020015f205f0180546121859061460f565b80601f01602080910402602001604051908101604052809291908181526020018280546121b19061460f565b80156121fc5780601f106121d3576101008083540402835291602001916121fc565b820191905f5260205f20905b8154815290600101906020018083116121df57829003601f168201915b505050505090506001830361221357849150612268565b5f80600190505b848110156122575760105f8281526020019081526020015f2060010154826122429190614d65565b9150808061224f90615282565b91505061221a565b50808661226491906149d0565b9250505b600b8161227484613269565b6040516020016122869392919061554f565b60405160208183030381529060405293505050505b919050565b6012602052805f5260405f205f915090505481565b6122bd6129a3565b6122c5612b8f565b60105f8381526020019081526020015f206004015f9054906101000a900460ff16612325576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231c90614d47565b60405180910390fd5b600854816009546123369190614d65565b1115612377576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236e90614de2565b60405180910390fd5b5f600160105f8581526020019081526020015f20600201546123999190614d65565b90506123ae6123a6611e6a565b838584612bde565b506123b7612e22565b5050565b6014602052805f5260405f205f915054906101000a900460ff1681565b6060600c80546123e79061460f565b80601f01602080910402602001604051908101604052809291908181526020018280546124139061460f565b801561245e5780601f106124355761010080835404028352916020019161245e565b820191905f5260205f20905b81548152906001019060200180831161244157829003601f168201915b5050505050905090565b5f60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b6124fe6129a3565b60135f8381526020019081526020015f205f9054906101000a900460ff1661255b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612552906155ea565b60405180910390fd5b5f60135f8481526020019081526020015f205f6101000a81548160ff02191690831515021790555061259661258f836118f1565b8284612af5565b5050565b600e5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6125c76129a3565b60135f8281526020019081526020015f205f9054906101000a900460ff16612624576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261b906155ea565b60405180910390fd5b5f60135f8381526020019081526020015f205f6101000a81548160ff0219169083151502179055505f612656826118f1565b90505f60145f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550817f3fe19a85ed8afb2bce4bea665515d954120221f6e4df37b1fd68d65501fd1fec60405160405180910390a25050565b6126e56129a3565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274a90615678565b60405180910390fd5b61275c81612e65565b50565b6127676129a3565b60115f8381526020019081526020015f205f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f90555050565b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061288457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612894575061289382613333565b5b9050919050565b6128a481612a21565b6128e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128da90615078565b60405180910390fd5b50565b5f33905090565b8160045f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661295d836118f1565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6129ab6128e6565b73ffffffffffffffffffffffffffffffffffffffff166129c9611e6a565b73ffffffffffffffffffffffffffffffffffffffff1614612a1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a16906156e0565b60405180910390fd5b565b5f8073ffffffffffffffffffffffffffffffffffffffff16612a4283612e2c565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b5f80612a6c836118f1565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612aae5750612aad8185612468565b5b80612aec57508373ffffffffffffffffffffffffffffffffffffffff16612ad484610d24565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b60145f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615612b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7690614cdf565b60405180910390fd5b612b8a83838361339c565b505050565b600260075403612bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bcb90615748565b60405180910390fd5b6002600781905550565b5f82118015612bef5750600a548211155b612c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c25906157b0565b60405180910390fd5b60085483600954612c3f9190614d65565b1115612c80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7790615818565b60405180910390fd5b60105f8381526020019081526020015f20600101548360105f8581526020019081526020015f2060020154612cb59190614d65565b1115612cf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ced90615880565b60405180910390fd5b5f5b83811015612dd9575f80600190505b84811015612d445760105f8281526020019081526020015f206001015482612d2f9190614d65565b91508080612d3c90615282565b915050612d07565b505f828483612d539190614d65565b612d5d9190614d65565b9050612d698782613688565b8460125f8381526020019081526020015f20819055505f612d89826120bb565b9050817f4c582017928a1bb7075268e9b0ab7e47ccf1bc5cb7638da3e8f97b3cdcc887e682604051612dbb9190613d61565b60405180910390a25050508080612dd190615282565b915050612cf8565b508260095f828254612deb9190614d65565b925050819055508260105f8481526020019081526020015f206002015f828254612e159190614d65565b9250508190555050505050565b6001600781905550565b5f60025f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f805f90505f600190505b83811015612f705760105f8281526020019081526020015f206001015482612f5b9190614d65565b91508080612f6890615282565b915050612f33565b50600181612f7e9190614d65565b915050919050565b5f80612f9183612f28565b9050600160105f8581526020019081526020015f206002015482612fb59190614d65565b612fbf91906149d0565b915050919050565b60605f60018451612fd89190614d65565b67ffffffffffffffff811115612ff157612ff06140ea565b5b60405190808252806020026020018201604052801561301f5781602001602082028036833780820191505090505b5090505f5b845181101561307a578481815181106130405761303f61589e565b5b602002602001015182828151811061305b5761305a61589e565b5b602002602001018181525050808061307290615282565b915050613024565b5082818551815181106130905761308f61589e565b5b6020026020010181815250508091505092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613114576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161310b90615915565b60405180910390fd5b8060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516132009190613cbe565b60405180910390a3505050565b613218848484612af5565b613224848484846136a5565b613263576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325a906159a3565b60405180910390fd5b50505050565b60605f600161327784613827565b0190505f8167ffffffffffffffff811115613295576132946140ea565b5b6040519080825280601f01601f1916602001820160405280156132c75781602001600182028036833780820191505090505b5090505f82602001820190505b600115613328578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161331d5761331c614973565b5b0494505f85036132d4575b819350505050919050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b8273ffffffffffffffffffffffffffffffffffffffff166133bc826118f1565b73ffffffffffffffffffffffffffffffffffffffff1614613412576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161340990615a31565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613480576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161347790615abf565b60405180910390fd5b61348d8383836001613978565b8273ffffffffffffffffffffffffffffffffffffffff166134ad826118f1565b73ffffffffffffffffffffffffffffffffffffffff1614613503576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134fa90615a31565b60405180910390fd5b60045f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540392505081905550600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613683838383600161397e565b505050565b6136a1828260405180602001604052805f815250613984565b5050565b5f6136c58473ffffffffffffffffffffffffffffffffffffffff166139de565b1561381a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026136ee6128e6565b8786866040518563ffffffff1660e01b81526004016137109493929190615b2f565b6020604051808303815f875af192505050801561374b57506040513d601f19601f820116820180604052508101906137489190615b8d565b60015b6137ca573d805f8114613779576040519150601f19603f3d011682016040523d82523d5f602084013e61377e565b606091505b505f8151036137c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137b9906159a3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061381f565b600190505b949350505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310613883577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161387957613878614973565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106138c0576d04ee2d6d415b85acef810000000083816138b6576138b5614973565b5b0492506020810190505b662386f26fc1000083106138ef57662386f26fc1000083816138e5576138e4614973565b5b0492506010810190505b6305f5e1008310613918576305f5e100838161390e5761390d614973565b5b0492506008810190505b612710831061393d57612710838161393357613932614973565b5b0492506004810190505b60648310613960576064838161395657613955614973565b5b0492506002810190505b600a831061396f576001810190505b80915050919050565b50505050565b50505050565b61398e8383613a00565b61399a5f8484846136a5565b6139d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139d0906159a3565b60405180910390fd5b505050565b5f808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613a6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a6590615c28565b60405180910390fd5b613a7781612a21565b15613ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613aae90615c90565b60405180910390fd5b613ac45f83836001613978565b613acd81612a21565b15613b0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b0490615c90565b60405180910390fd5b600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613c0f5f8383600161397e565b5050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613c5881613c24565b8114613c62575f80fd5b50565b5f81359050613c7381613c4f565b92915050565b5f60208284031215613c8e57613c8d613c1c565b5b5f613c9b84828501613c65565b91505092915050565b5f8115159050919050565b613cb881613ca4565b82525050565b5f602082019050613cd15f830184613caf565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613d0e578082015181840152602081019050613cf3565b5f8484015250505050565b5f601f19601f8301169050919050565b5f613d3382613cd7565b613d3d8185613ce1565b9350613d4d818560208601613cf1565b613d5681613d19565b840191505092915050565b5f6020820190508181035f830152613d798184613d29565b905092915050565b5f819050919050565b613d9381613d81565b8114613d9d575f80fd5b50565b5f81359050613dae81613d8a565b92915050565b5f60208284031215613dc957613dc8613c1c565b5b5f613dd684828501613da0565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613e0882613ddf565b9050919050565b613e1881613dfe565b82525050565b5f602082019050613e315f830184613e0f565b92915050565b613e4081613dfe565b8114613e4a575f80fd5b50565b5f81359050613e5b81613e37565b92915050565b5f8060408385031215613e7757613e76613c1c565b5b5f613e8485828601613e4d565b9250506020613e9585828601613da0565b9150509250929050565b613ea881613d81565b82525050565b5f602082019050613ec15f830184613e9f565b92915050565b5f60208284031215613edc57613edb613c1c565b5b5f613ee984828501613e4d565b91505092915050565b5f805f60608486031215613f0957613f08613c1c565b5b5f613f1686828701613da0565b9350506020613f2786828701613e4d565b9250506040613f3886828701613da0565b9150509250925092565b613f4b81613ca4565b8114613f55575f80fd5b50565b5f81359050613f6681613f42565b92915050565b5f60208284031215613f8157613f80613c1c565b5b5f613f8e84828501613f58565b91505092915050565b5f805f60608486031215613fae57613fad613c1c565b5b5f613fbb86828701613e4d565b9350506020613fcc86828701613e4d565b9250506040613fdd86828701613da0565b9150509250925092565b5f8060408385031215613ffd57613ffc613c1c565b5b5f61400a85828601613da0565b925050602061401b85828601613da0565b9150509250929050565b5f6040820190506140385f830185613e0f565b6140456020830184613e9f565b9392505050565b5f806040838503121561406257614061613c1c565b5b5f61406f85828601613da0565b925050602061408085828601613f58565b9150509250929050565b5f60a0820190508181035f8301526140a28188613d29565b90506140b16020830187613e9f565b6140be6040830186613e9f565b6140cb6060830185613e9f565b6140d86080830184613caf565b9695505050505050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61412082613d19565b810181811067ffffffffffffffff8211171561413f5761413e6140ea565b5b80604052505050565b5f614151613c13565b905061415d8282614117565b919050565b5f67ffffffffffffffff82111561417c5761417b6140ea565b5b61418582613d19565b9050602081019050919050565b828183375f83830152505050565b5f6141b26141ad84614162565b614148565b9050828152602081018484840111156141ce576141cd6140e6565b5b6141d9848285614192565b509392505050565b5f82601f8301126141f5576141f46140e2565b5b81356142058482602086016141a0565b91505092915050565b5f6020828403121561422357614222613c1c565b5b5f82013567ffffffffffffffff8111156142405761423f613c20565b5b61424c848285016141e1565b91505092915050565b5f805f6060848603121561426c5761426b613c1c565b5b5f61427986828701613da0565b935050602061428a86828701613da0565b925050604061429b86828701613f58565b9150509250925092565b5f805f80608085870312156142bd576142bc613c1c565b5b5f6142ca87828801613da0565b945050602085013567ffffffffffffffff8111156142eb576142ea613c20565b5b6142f7878288016141e1565b935050604061430887828801613da0565b925050606061431987828801613da0565b91505092959194509250565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61435781613d81565b82525050565b5f614368838361434e565b60208301905092915050565b5f602082019050919050565b5f61438a82614325565b614394818561432f565b935061439f8361433f565b805f5b838110156143cf5781516143b6888261435d565b97506143c183614374565b9250506001810190506143a2565b5085935050505092915050565b5f6040820190506143ef5f830185613caf565b81810360208301526144018184614380565b90509392505050565b5f80604083850312156144205761441f613c1c565b5b5f61442d85828601613da0565b925050602061443e85828601613e4d565b9150509250929050565b5f806040838503121561445e5761445d613c1c565b5b5f61446b85828601613e4d565b925050602061447c85828601613f58565b9150509250929050565b5f67ffffffffffffffff8211156144a05761449f6140ea565b5b6144a982613d19565b9050602081019050919050565b5f6144c86144c384614486565b614148565b9050828152602081018484840111156144e4576144e36140e6565b5b6144ef848285614192565b509392505050565b5f82601f83011261450b5761450a6140e2565b5b813561451b8482602086016144b6565b91505092915050565b5f805f806080858703121561453c5761453b613c1c565b5b5f61454987828801613e4d565b945050602061455a87828801613e4d565b935050604061456b87828801613da0565b925050606085013567ffffffffffffffff81111561458c5761458b613c20565b5b614598878288016144f7565b91505092959194509250565b5f80604083850312156145ba576145b9613c1c565b5b5f6145c785828601613e4d565b92505060206145d885828601613e4d565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061462657607f821691505b602082108103614639576146386145e2565b5b50919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e5f8201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b5f614699602283613ce1565b91506146a48261463f565b604082019050919050565b5f6020820190508181035f8301526146c68161468d565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f7420745f8201527f6f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000602082015250565b5f614727603e83613ce1565b9150614732826146cd565b604082019050919050565b5f6020820190508181035f8301526147548161471b565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f5f8201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b5f6147b5602f83613ce1565b91506147c08261475b565b604082019050919050565b5f6020820190508181035f8301526147e2816147a9565b9050919050565b7f43616e6e6f7420626c61636b6c6973742074686520636f6e7472616374206f775f8201527f6e65720000000000000000000000000000000000000000000000000000000000602082015250565b5f614843602383613ce1565b915061484e826147e9565b604082019050919050565b5f6020820190508181035f83015261487081614837565b9050919050565b7f455243373231413a2063616c6c6572206973206e6f7420746f6b656e206f776e5f8201527f6572206f7220617070726f766564000000000000000000000000000000000000602082015250565b5f6148d1602e83613ce1565b91506148dc82614877565b604082019050919050565b5f6020820190508181035f8301526148fe816148c5565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61493c82613d81565b915061494783613d81565b925082820261495581613d81565b9150828204841483151761496c5761496b614905565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6149aa82613d81565b91506149b583613d81565b9250826149c5576149c4614973565b5b828204905092915050565b5f6149da82613d81565b91506149e583613d81565b92508282039050818111156149fd576149fc614905565b5b92915050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302614a5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614a24565b614a698683614a24565b95508019841693508086168417925050509392505050565b5f819050919050565b5f614aa4614a9f614a9a84613d81565b614a81565b613d81565b9050919050565b5f819050919050565b614abd83614a8a565b614ad1614ac982614aab565b848454614a30565b825550505050565b5f90565b614ae5614ad9565b614af0818484614ab4565b505050565b5b81811015614b1357614b085f82614add565b600181019050614af6565b5050565b601f821115614b5857614b2981614a03565b614b3284614a15565b81016020851015614b41578190505b614b55614b4d85614a15565b830182614af5565b50505b505050565b5f82821c905092915050565b5f614b785f1984600802614b5d565b1980831691505092915050565b5f614b908383614b69565b9150826002028217905092915050565b614ba982613cd7565b67ffffffffffffffff811115614bc257614bc16140ea565b5b614bcc825461460f565b614bd7828285614b17565b5f60209050601f831160018114614c08575f8415614bf6578287015190505b614c008582614b85565b865550614c67565b601f198416614c1686614a03565b5f5b82811015614c3d57848901518255600182019150602085019450602081019050614c18565b86831015614c5a5784890151614c56601f891682614b69565b8355505b6001600288020188555050505b505050505050565b7f5472616e7366657220746f206120626c61636b6c6973746564206164647265735f8201527f73206973206e6f7420616c6c6f77656400000000000000000000000000000000602082015250565b5f614cc9603083613ce1565b9150614cd482614c6f565b604082019050919050565b5f6020820190508181035f830152614cf681614cbd565b9050919050565b7f426174636820697320636c6f73656400000000000000000000000000000000005f82015250565b5f614d31600f83613ce1565b9150614d3c82614cfd565b602082019050919050565b5f6020820190508181035f830152614d5e81614d25565b9050919050565b5f614d6f82613d81565b9150614d7a83613d81565b9250828201905080821115614d9257614d91614905565b5b92915050565b7f496e73756666696369656e74206d696e7473206c6566740000000000000000005f82015250565b5f614dcc601783613ce1565b9150614dd782614d98565b602082019050919050565b5f6020820190508181035f830152614df981614dc0565b9050919050565b7f496e636f72726563742070617961626c6520616d6f756e7400000000000000005f82015250565b5f614e34601883613ce1565b9150614e3f82614e00565b602082019050919050565b5f6020820190508181035f830152614e6181614e28565b9050919050565b7f57686974656c697374206d696e74206973206e6f7420616374697665000000005f82015250565b5f614e9c601c83613ce1565b9150614ea782614e68565b602082019050919050565b5f6020820190508181035f830152614ec981614e90565b9050919050565b7f4e6f7420616c6c6f77656420746f206d696e74207468697320616d6f756e74005f82015250565b5f614f04601f83613ce1565b9150614f0f82614ed0565b602082019050919050565b5f6020820190508181035f830152614f3181614ef8565b9050919050565b7f5075626c6963206d696e74206973206e6f7420616374697665206174207468655f8201527f206d6f6d656e742e000000000000000000000000000000000000000000000000602082015250565b5f614f92602883613ce1565b9150614f9d82614f38565b604082019050919050565b5f6020820190508181035f830152614fbf81614f86565b9050919050565b7f496e76616c696420726f79616c74792070657263656e746167650000000000005f82015250565b5f614ffa601a83613ce1565b915061500582614fc6565b602082019050919050565b5f6020820190508181035f83015261502781614fee565b9050919050565b7f455243373231413a20696e76616c696420746f6b656e204944000000000000005f82015250565b5f615062601983613ce1565b915061506d8261502e565b602082019050919050565b5f6020820190508181035f83015261508f81615056565b9050919050565b7f4d617820737570706c792063616e6e6f742062652030000000000000000000005f82015250565b5f6150ca601683613ce1565b91506150d582615096565b602082019050919050565b5f6020820190508181035f8301526150f7816150be565b9050919050565b7f4d617820737570706c792063616e6e6f74206265206c657373207468616e20635f8201527f757272656e7420737570706c7900000000000000000000000000000000000000602082015250565b5f615158602d83613ce1565b9150615163826150fe565b604082019050919050565b5f6020820190508181035f8301526151858161514c565b9050919050565b7f455243373231413a2061646472657373207a65726f206973206e6f74206120765f8201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b5f6151e6602a83613ce1565b91506151f18261518c565b604082019050919050565b5f6020820190508181035f830152615213816151da565b9050919050565b7f4261746368204944206d7573742062652067726561746572207468616e2030005f82015250565b5f61524e601f83613ce1565b91506152598261521a565b602082019050919050565b5f6020820190508181035f83015261527b81615242565b9050919050565b5f61528c82613d81565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036152be576152bd614905565b5b600182019050919050565b7f416464696e67207468697320626174636820776f756c642065786365656420745f8201527f6865206d617820737570706c79206f662074686520636f6e7472616374000000602082015250565b5f615323603d83613ce1565b915061532e826152c9565b604082019050919050565b5f6020820190508181035f83015261535081615317565b9050919050565b5f8151905061536581613e37565b92915050565b5f602082840312156153805761537f613c1c565b5b5f61538d84828501615357565b91505092915050565b5f81905092915050565b5f81546153ac8161460f565b6153b68186615396565b9450600182165f81146153d057600181146153e557615417565b60ff1983168652811515820286019350615417565b6153ee85614a03565b5f5b8381101561540f578154818901526001820191506020810190506153f0565b838801955050505b50505092915050565b7f2f626c61636b6c697374656400000000000000000000000000000000000000005f82015250565b5f615454600c83615396565b915061545f82615420565b600c82019050919050565b5f61547582846153a0565b915061548082615448565b915081905092915050565b7f2f000000000000000000000000000000000000000000000000000000000000005f82015250565b5f6154bf600183615396565b91506154ca8261548b565b600182019050919050565b5f6154df82613cd7565b6154e98185615396565b93506154f9818560208601613cf1565b80840191505092915050565b7f2f6d657461646174612e6a736f6e0000000000000000000000000000000000005f82015250565b5f615539600e83615396565b915061554482615505565b600e82019050919050565b5f61555a82866153a0565b9150615565826154b3565b915061557182856154d5565b915061557c826154b3565b915061558882846154d5565b91506155938261552d565b9150819050949350505050565b7f546f6b656e206973206e6f7420626c61636b6c697374656400000000000000005f82015250565b5f6155d4601883613ce1565b91506155df826155a0565b602082019050919050565b5f6020820190508181035f830152615601816155c8565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f615662602683613ce1565b915061566d82615608565b604082019050919050565b5f6020820190508181035f83015261568f81615656565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6156ca602083613ce1565b91506156d582615696565b602082019050919050565b5f6020820190508181035f8301526156f7816156be565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f615732601f83613ce1565b915061573d826156fe565b602082019050919050565b5f6020820190508181035f83015261575f81615726565b9050919050565b7f496e76616c6964204261746368496400000000000000000000000000000000005f82015250565b5f61579a600f83613ce1565b91506157a582615766565b602082019050919050565b5f6020820190508181035f8301526157c78161578e565b9050919050565b7f57696c6c20657863656564206d6178696d756d20737570706c790000000000005f82015250565b5f615802601a83613ce1565b915061580d826157ce565b602082019050919050565b5f6020820190508181035f83015261582f816157f6565b9050919050565b7f45786365656473204261746368206d6178696d756d20737570706c79000000005f82015250565b5f61586a601c83613ce1565b915061587582615836565b602082019050919050565b5f6020820190508181035f8301526158978161585e565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f455243373231413a20617070726f766520746f2063616c6c65720000000000005f82015250565b5f6158ff601a83613ce1565b915061590a826158cb565b602082019050919050565b5f6020820190508181035f83015261592c816158f3565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e20455243373231525f8201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b5f61598d603383613ce1565b915061599882615933565b604082019050919050565b5f6020820190508181035f8301526159ba81615981565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f72726563745f8201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b5f615a1b602683613ce1565b9150615a26826159c1565b604082019050919050565b5f6020820190508181035f830152615a4881615a0f565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f615aa9602583613ce1565b9150615ab482615a4f565b604082019050919050565b5f6020820190508181035f830152615ad681615a9d565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f615b0182615add565b615b0b8185615ae7565b9350615b1b818560208601613cf1565b615b2481613d19565b840191505092915050565b5f608082019050615b425f830187613e0f565b615b4f6020830186613e0f565b615b5c6040830185613e9f565b8181036060830152615b6e8184615af7565b905095945050505050565b5f81519050615b8781613c4f565b92915050565b5f60208284031215615ba257615ba1613c1c565b5b5f615baf84828501615b79565b91505092915050565b7f455243373231413a206d696e7420746f20746865207a65726f206164647265735f8201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b5f615c12602183613ce1565b9150615c1d82615bb8565b604082019050919050565b5f6020820190508181035f830152615c3f81615c06565b9050919050565b7f455243373231413a20746f6b656e20616c7265616479206d696e7465640000005f82015250565b5f615c7a601d83613ce1565b9150615c8582615c46565b602082019050919050565b5f6020820190508181035f830152615ca781615c6e565b905091905056fea264697066735822122027b63808d3b579d1446f03352b01c7849ccd69b1cfd77a44024d22d6050d01e564736f6c63430008150033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000efc7f585a155f673310832c064833c87edb9dd55000000000000000000000000efc7f585a155f673310832c064833c87edb9dd55000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000002468747470733a2f2f6e616d6f2e61727468616e656574692e6f72672f6d6574616461746100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002468747470733a2f2f6e616d6f2e61727468616e656574692e6f72672f636f6e747261637400000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _beneficiary (address): 0xEfc7f585A155F673310832C064833c87EdB9dD55
Arg [1] : _royalties (address): 0xEfc7f585A155F673310832C064833c87EdB9dD55
Arg [2] : _initialBaseURI (string): https://namo.arthaneeti.org/metadata
Arg [3] : _initialContractURI (string): https://namo.arthaneeti.org/contract
-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 000000000000000000000000efc7f585a155f673310832c064833c87edb9dd55
Arg [1] : 000000000000000000000000efc7f585a155f673310832c064833c87edb9dd55
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000024
Arg [5] : 68747470733a2f2f6e616d6f2e61727468616e656574692e6f72672f6d657461
Arg [6] : 6461746100000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000024
Arg [8] : 68747470733a2f2f6e616d6f2e61727468616e656574692e6f72672f636f6e74
Arg [9] : 7261637400000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
246:13098:10:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12814:203;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2418:98:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3888:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3418:408;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2801:89:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1997:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11344:468;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9937:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2694:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;548:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4568:327:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1732:49:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13058:283;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;2208:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;620:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9729:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4996:850;;;;;;;;;;;;;:::i;:::-;;1286:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4962:179:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1386:39:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;3178:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3634:951;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2347:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2135:220:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;583:30:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;452:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;486:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2917:253;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1872:205:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1824:101:11;;;;;;;;;;;;;:::i;:::-;;9025:668:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7125:966;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;2162:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2589:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1194:85:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3487:97:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2581:102:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1513:66:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5904:278;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4123:153:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5208:315;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6226:891:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1636:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4615:354;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1788:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3382:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4343:162:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11872:269:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;653:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12179:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2074:198:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10117:129:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12814:203;12908:4;12943:26;12928:41;;;:11;:41;;;;:81;;;;12973:36;12997:11;12973:23;:36::i;:::-;12928:81;12921:88;;12814:203;;;:::o;2418:98:3:-;2472:13;2504:5;2497:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2418:98;:::o;3888:167::-;3964:7;3983:23;3998:7;3983:14;:23::i;:::-;4024:15;:24;4040:7;4024:24;;;;;;;;;;;;;;;;;;;;;4017:31;;3888:167;;;:::o;3418:408::-;3498:13;3514:23;3529:7;3514:14;:23::i;:::-;3498:39;;3561:5;3555:11;;:2;:11;;;3547:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;3653:5;3637:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3662:37;3679:5;3686:12;:10;:12::i;:::-;3662:16;:37::i;:::-;3637:62;3616:171;;;;;;;;;;;;:::i;:::-;;;;;;;;;3798:21;3807:2;3811:7;3798:8;:21::i;:::-;3488:338;3418:408;;:::o;2801:89:10:-;2845:7;2872:10;;2865:17;;2801:89;:::o;1997:108::-;1087:13:11;:11;:13::i;:::-;2085:12:10::1;2071:11;;:26;;;;;;;;;;;;;;;;;;1997:108:::0;:::o;11344:468::-;1087:13:11;:11;:13::i;:::-;11421:16:10::1;11429:7;11421;:16::i;:::-;11413:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;11500:18;11521:16;11529:7;11521;:16::i;:::-;11500:37;;11570:7;:5;:7::i;:::-;11556:21;;:10;:21;;::::0;11548:69:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;11657:4;11628:17;:26;11646:7;11628:26;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;11707:4;11672:20;:32;11693:10;11672:32;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;11722:17;11742;11751:7;11742:8;:17::i;:::-;11722:37;;11791:7;11775:29;11800:3;11775:29;;;;;;:::i;:::-;;;;;;;;11402:410;;11344:468:::0;:::o;9937:142::-;1087:13:11;:11;:13::i;:::-;10065:6:10::1;10036:11;:20;10048:7;10036:20;;;;;;;;;;;:26;10057:4;10036:26;;;;;;;;;;;;;;;:35;;;;9937:142:::0;;;:::o;2694:99::-;1087:13:11;:11;:13::i;:::-;2774:11:10::1;2761:10;;:24;;;;;;;;;;;;;;;;;;2694:99:::0;:::o;548:28::-;;;;;;;;;;;;;:::o;4568:327:3:-;4757:41;4776:12;:10;:12::i;:::-;4790:7;4757:18;:41::i;:::-;4749:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;4860:28;4870:4;4876:2;4880:7;4860:9;:28::i;:::-;4568:327;;;:::o;1732:49:10:-;;;;;;;;;;;;;;;;;;;;;;:::o;13058:283::-;13149:7;13158:21;13286:3;13265:17;;13252:10;:30;;;;:::i;:::-;13251:38;;;;:::i;:::-;13235:54;;13308:9;;;;;;;;;;;13300:33;;13058:283;;;;;:::o;2208:100::-;1087:13:11;:11;:13::i;:::-;2290:10:10::1;2278:9;;:22;;;;;;;;;;;;;;;;;;2208:100:::0;:::o;620:26::-;;;;;;;;;;;;;:::o;9729:129::-;1087:13:11;:11;:13::i;:::-;9841:9:10::1;9814:6;:15;9821:7;9814:15;;;;;;;;;;;:24;;;:36;;;;;;;;;;;;;;;;;;9729:129:::0;;:::o;4996:850::-;1087:13:11;:11;:13::i;:::-;5044:15:10::1;5062:21;5044:39;;5094:21;5126:25:::0;5265:11:::1;;;;;;;;;;;5252:24;;:9;;;;;;;;;;;:24;;::::0;5248:480:::1;;5364:7;5344:27;;5248:480;;;5555:3;5535:17;;5525:7;:27;;;;:::i;:::-;:33;;;;:::i;:::-;5509:49;;5603:13;5593:7;:23;;;;:::i;:::-;5573:43;;5639:9;;;;;;;;;;;5631:27;;:42;5659:13;5631:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;5248:480;5746:11;;;;;;;;;;;5738:29;;:48;5768:17;5738:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;5033:813;;;4996:850::o:0;1286:49::-;;;;;;;;;;;;;;;;;:::o;4962:179:3:-;5095:39;5112:4;5118:2;5122:7;5095:39;;;;;;;;;;;;:16;:39::i;:::-;4962:179;;;:::o;1386:39:10:-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3178:88::-;1087:13:11;:11;:13::i;:::-;3255:3:10::1;3245:7;:13;;;;;;:::i;:::-;;3178:88:::0;:::o;3634:951::-;2261:21:12;:19;:21::i;:::-;3740:14:10::1;3757:12;:10;:12::i;:::-;3740:29;;3789:20;:28;3810:6;3789:28;;;;;;;;;;;;;;;;;;;;;;;;;3788:29;3780:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;3889:6;:15;3896:7;3889:15;;;;;;;;;;;:24;;;;;;;;;;;;3881:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;3975:10;;3965:6;3952:10;;:19;;;;:::i;:::-;:33;;3944:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;4069:6;4045;:15;4052:7;4045:15;;;;;;;;;;;:21;;;:30;;;;:::i;:::-;4032:9;:43;4024:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;4121:10;;;;;;;;;;;4117:341;;;4156:13;4148:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;4257:6;4225:11;:20;4237:7;4225:20;;;;;;;;;;;:28;4246:6;4225:28;;;;;;;;;;;;;;;;:38;;4217:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;4346:6;4314:11;:20;4326:7;4314:20;;;;;;;;;;;:28;4335:6;4314:28;;;;;;;;;;;;;;;;:38;;;;;;;:::i;:::-;;;;;;;;4117:341;;;4393:8;;;;;;;;;;;4385:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;4117:341;4470:14;4519:1;4487:6;:15;4494:7;4487:15;;;;;;;;;;;:29;;;:33;;;;:::i;:::-;4470:50;;4531:46;4545:6;4553;4561:7;4570:6;4531:13;:46::i;:::-;3729:856;;2303:20:12::0;:18;:20::i;:::-;3634:951:10;;;:::o;2347:234::-;1087:13:11;:11;:13::i;:::-;2463:1:10::1;2441:18;:23;;:52;;;;;2490:3;2468:18;:25;;2441:52;2433:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;2555:18;2535:17;:38;;;;2347:234:::0;:::o;2135:220:3:-;2207:7;2226:13;2242:17;2251:7;2242:8;:17::i;:::-;2226:33;;2294:1;2277:19;;:5;:19;;;2269:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;2343:5;2336:12;;;2135:220;;;:::o;583:30:10:-;;;;;;;;;;;;;:::o;452:27::-;;;;:::o;486:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2917:253::-;1087:13:11;:11;:13::i;:::-;3008:1:10::1;2995:10;:14;2987:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;3068:10;;3055;:23;3047:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;3152:10;3139;:23;;;;2917:253:::0;:::o;1872:205:3:-;1944:7;1988:1;1971:19;;:5;:19;;;1963:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2054:9;:16;2064:5;2054:16;;;;;;;;;;;;;;;;2047:23;;1872:205;;;:::o;1824:101:11:-;1087:13;:11;:13::i;:::-;1888:30:::1;1915:1;1888:18;:30::i;:::-;1824:101::o:0;9025:668:10:-;1087:13:11;:11;:13::i;:::-;9165:1:10::1;9155:7;:11;9147:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;9282:25;9327:9:::0;9339:1:::1;9327:13;;9322:105;9346:7;9342:1;:11;9322:105;;;9396:6;:9;9403:1;9396:9;;;;;;;;;;;:19;;;9375:40;;;;;:::i;:::-;;;9355:3;;;;;:::i;:::-;;;;9322:105;;;;9458:9;9437:30;;;;;:::i;:::-;;;9509:10;;9488:17;:31;;9480:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;9616:44;;;;;;;;9622:9;9616:44;;;;9633:9;9616:44;;;;9644:1;9616:44;;;;9647:5;9616:44;;;;9654:5;9616:44;;;;::::0;9598:6:::1;:15;9605:7;9598:15;;;;;;;;;;;:62;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9671:12;;:14;;;;;;;;;:::i;:::-;;;;;;9136:557;9025:668:::0;;;;:::o;7125:966::-;7190:4;7196:16;7225:28;7264:18;7304:15;7322:1;7304:19;;7299:736;7336:12;;7325:7;:23;7299:736;;7376:20;7399:24;7415:7;7399:15;:24::i;:::-;7376:47;;7438:18;7459:22;7473:7;7459:13;:22::i;:::-;7438:43;;7503:15;7521:12;7503:30;;7498:526;7546:10;7535:7;:21;7498:526;;7592:4;:12;;;7605:7;7592:21;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;7588:421;;;7674:6;7665:15;;:5;:15;;;7661:232;;7709:12;;;;;:::i;:::-;;;;7828:41;7848:11;7861:7;7828:19;:41::i;:::-;7814:55;;7661:232;7614:298;7588:421;7558:9;;;;;:::i;:::-;;;;7498:526;;;;7361:674;;7350:9;;;;;:::i;:::-;;;;7299:736;;;;8068:1;8055:10;:14;8071:11;8047:36;;;;;;7125:966;;;:::o;2162:37::-;;;;:::o;2589:97::-;1087:13:11;:11;:13::i;:::-;2669:9:10::1;2658:8;;:20;;;;;;;;;;;;;;;;;;2589:97:::0;:::o;1194:85:11:-;1240:7;1266:6;;;;;;;;;;;1259:13;;1194:85;:::o;3487:97:10:-;1087:13:11;:11;:13::i;:::-;3573:3:10::1;3558:12;:18;;;;;;:::i;:::-;;3487:97:::0;:::o;2581:102:3:-;2637:13;2669:7;2662:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2581:102;:::o;1513:66:10:-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5904:278::-;1087:13:11;:11;:13::i;:::-;5982:18:10::1;6003:16;6011:7;6003;:16::i;:::-;5982:37;;6039:20;:32;6060:10;6039:32;;;;;;;;;;;;;;;;;;;;;;;;;6038:33;6030:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;6143:10;6135:28;;:39;6164:9;6135:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;5971:211;5904:278:::0;:::o;4123:153:3:-;4217:52;4236:12;:10;:12::i;:::-;4250:8;4260;4217:18;:52::i;:::-;4123:153;;:::o;5208:315::-;5376:41;5395:12;:10;:12::i;:::-;5409:7;5376:18;:41::i;:::-;5368:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;5478:38;5492:4;5498:2;5502:7;5511:4;5478:13;:38::i;:::-;5208:315;;;;:::o;6226:891:10:-;6299:13;6333:16;6341:7;6333;:16::i;:::-;6325:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;6418:17;:26;6436:7;6418:26;;;;;;;;;;;;;;;;;;;;;6414:115;;;6492:7;6475:41;;;;;;;;:::i;:::-;;;;;;;;;;;;;6461:56;;;;6414:115;6541:15;6559:12;:21;6572:7;6559:21;;;;;;;;;;;;6541:39;;6591:14;6618:23;6644:6;:15;6651:7;6644:15;;;;;;;;;;;:20;;6618:46;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6692:1;6681:7;:12;6677:322;;6719:7;6710:16;;6677:322;;;6759:32;6815:9;6827:1;6815:13;;6810:120;6834:7;6830:1;:11;6810:120;;;6895:6;:9;6902:1;6895:9;;;;;;;;;;;:19;;;6867:47;;;;;:::i;:::-;;;6843:3;;;;;:::i;:::-;;;;6810:120;;;;6963:24;6953:7;:34;;;;:::i;:::-;6944:43;;6744:255;6677:322;7042:7;7056:9;7072:17;:6;:15;:17::i;:::-;7025:83;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;7011:98;;;;;6226:891;;;;:::o;1636:47::-;;;;;;;;;;;;;;;;;:::o;4615:354::-;1087:13:11;:11;:13::i;:::-;2261:21:12::1;:19;:21::i;:::-;4716:6:10::2;:15;4723:7;4716:15;;;;;;;;;;;:24;;;;;;;;;;;;4708:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;4802:10;;4792:6;4779:10;;:19;;;;:::i;:::-;:33;;4771:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;4853:14;4902:1;4870:6;:15;4877:7;4870:15;;;;;;;;;;;:29;;;:33;;;;:::i;:::-;4853:50;;4914:47;4928:7;:5;:7::i;:::-;4937:6;4945:7;4954:6;4914:13;:47::i;:::-;4697:272;2303:20:12::1;:18;:20::i;:::-;4615:354:10::0;;:::o;1788:52::-;;;;;;;;;;;;;;;;;;;;;;:::o;3382:97::-;3426:13;3459:12;3452:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3382:97;:::o;4343:162:3:-;4440:4;4463:18;:25;4482:5;4463:25;;;;;;;;;;;;;;;:35;4489:8;4463:35;;;;;;;;;;;;;;;;;;;;;;;;;4456:42;;4343:162;;;;:::o;11872:269:10:-;1087:13:11;:11;:13::i;:::-;11976:17:10::1;:26;11994:7;11976:26;;;;;;;;;;;;;;;;;;;;;11968:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12071:5;12042:17;:26;12060:7;12042:26;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;12087:46;12097:16;12105:7;12097;:16::i;:::-;12115:8;12125:7;12087:9;:46::i;:::-;11872:269:::0;;:::o;653:24::-;;;;;;;;;;;;;:::o;12179:339::-;1087:13:11;:11;:13::i;:::-;12261:17:10::1;:26;12279:7;12261:26;;;;;;;;;;;;;;;;;;;;;12253:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12356:5;12327:17;:26;12345:7;12327:26;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;12372:18;12393:16;12401:7;12393;:16::i;:::-;12372:37;;12455:5;12420:20;:32;12441:10;12420:32;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;12502:7;12476:34;;;;;;;;;;12242:276;12179:339:::0;:::o;2074:198:11:-;1087:13;:11;:13::i;:::-;2182:1:::1;2162:22;;:8;:22;;::::0;2154:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2237:28;2256:8;2237:18;:28::i;:::-;2074:198:::0;:::o;10117:129:10:-;1087:13:11;:11;:13::i;:::-;10212:11:10::1;:20;10224:7;10212:20;;;;;;;;;;;:26;10233:4;10212:26;;;;;;;;;;;;;;;10205:33;;;10117:129:::0;;:::o;1512:300:3:-;1614:4;1664:25;1649:40;;;:11;:40;;;;:104;;;;1720:33;1705:48;;;:11;:48;;;;1649:104;:156;;;;1769:36;1793:11;1769:23;:36::i;:::-;1649:156;1630:175;;1512:300;;;:::o;13438:134::-;13519:16;13527:7;13519;:16::i;:::-;13511:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;13438:134;:::o;640:96:1:-;693:7;719:10;712:17;;640:96;:::o;12739:171:3:-;12840:2;12813:15;:24;12829:7;12813:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;12895:7;12891:2;12857:46;;12866:23;12881:7;12866:14;:23::i;:::-;12857:46;;;;;;;;;;;;12739:171;;:::o;1352:130:11:-;1426:12;:10;:12::i;:::-;1415:23;;:7;:5;:7::i;:::-;:23;;;1407:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1352:130::o;7218:126:3:-;7283:4;7335:1;7306:31;;:17;7315:7;7306:8;:17::i;:::-;:31;;;;7299:38;;7218:126;;;:::o;7502:261::-;7595:4;7611:13;7627:23;7642:7;7627:14;:23::i;:::-;7611:39;;7679:5;7668:16;;:7;:16;;;:52;;;;7688:32;7705:5;7712:7;7688:16;:32::i;:::-;7668:52;:87;;;;7748:7;7724:31;;:20;7736:7;7724:11;:20::i;:::-;:31;;;7668:87;7660:96;;;7502:261;;;;:::o;12561:230:10:-;12661:20;:24;12682:2;12661:24;;;;;;;;;;;;;;;;;;;;;;;;;12660:25;12652:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;12749:34;12765:4;12771:2;12775:7;12749:15;:34::i;:::-;12561:230;;;:::o;2336:287:12:-;1759:1;2468:7;;:19;2460:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1759:1;2598:7;:18;;;;2336:287::o;10301:964:10:-;10422:1;10412:7;:11;:38;;;;;10438:12;;10427:7;:23;;10412:38;10404:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;10512:10;;10502:6;10489:10;;:19;;;;:::i;:::-;:33;;10481:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;10614:6;:15;10621:7;10614:15;;;;;;;;;;;:25;;;10604:6;10572;:15;10579:7;10572:15;;;;;;;;;;;:29;;;:38;;;;:::i;:::-;:67;;10564:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;10690:9;10685:490;10709:6;10705:1;:10;10685:490;;;10737:32;10793:9;10805:1;10793:13;;10788:120;10812:7;10808:1;:11;10788:120;;;10873:6;:9;10880:1;10873:9;;;;;;;;;;;:19;;;10845:47;;;;;:::i;:::-;;;10821:3;;;;;:::i;:::-;;;;10788:120;;;;10922:15;10976:1;10967:6;10940:24;:33;;;;:::i;:::-;:37;;;;:::i;:::-;10922:55;;10994:22;11004:2;11008:7;10994:9;:22::i;:::-;11055:7;11031:12;:21;11044:7;11031:21;;;;;;;;;;;:31;;;;11077:17;11097;11106:7;11097:8;:17::i;:::-;11077:37;;11150:7;11134:29;11159:3;11134:29;;;;;;:::i;:::-;;;;;;;;10722:453;;;10717:3;;;;;:::i;:::-;;;;10685:490;;;;11201:6;11187:10;;:20;;;;;;;:::i;:::-;;;;;;;;11251:6;11218;:15;11225:7;11218:15;;;;;;;;;;;:29;;;:39;;;;;;;:::i;:::-;;;;;;;;10301:964;;;;:::o;2629:209:12:-;1716:1;2809:7;:22;;;;2629:209::o;6800:115:3:-;6866:7;6892;:16;6900:7;6892:16;;;;;;;;;;;;;;;;;;;;;6885:23;;6800:115;;;:::o;2426:187:11:-;2499:16;2518:6;;;;;;;;;;;2499:25;;2543:8;2534:6;;:17;;;;;;;;;;;;;;;;;;2597:8;2566:40;;2587:8;2566:40;;;;;;;;;;;;2489:124;2426:187;:::o;8490:296:10:-;8554:7;8574:32;8609:1;8574:36;;8626:9;8638:1;8626:13;;8621:112;8645:7;8641:1;:11;8621:112;;;8702:6;:9;8709:1;8702:9;;;;;;;;;;;:19;;;8674:47;;;;;:::i;:::-;;;8654:3;;;;;:::i;:::-;;;;8621:112;;;;8777:1;8750:24;:28;;;;:::i;:::-;8743:35;;;8490:296;;;:::o;8794:203::-;8856:7;8876:20;8899:24;8915:7;8899:15;:24::i;:::-;8876:47;;8988:1;8956:6;:15;8963:7;8956:15;;;;;;;;;;;:29;;;8941:12;:44;;;;:::i;:::-;:48;;;;:::i;:::-;8934:55;;;8794:203;;;:::o;8099:381::-;8194:16;8223:29;8284:1;8269:5;:12;:16;;;;:::i;:::-;8255:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8223:63;;8302:9;8297:96;8321:5;:12;8317:1;:16;8297:96;;;8373:5;8379:1;8373:8;;;;;;;;:::i;:::-;;;;;;;;8355:12;8368:1;8355:15;;;;;;;;:::i;:::-;;;;;;;:26;;;;;8335:3;;;;;:::i;:::-;;;;8297:96;;;;8432:10;8403:12;8416:5;:12;8403:26;;;;;;;;:::i;:::-;;;;;;;:39;;;;;8460:12;8453:19;;;8099:381;;;;:::o;13046:308:3:-;13196:8;13187:17;;:5;:17;;;13179:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;13283:8;13245:18;:25;13264:5;13245:25;;;;;;;;;;;;;;;:35;13271:8;13245:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;13328:8;13306:41;;13321:5;13306:41;;;13338:8;13306:41;;;;;;:::i;:::-;;;;;;;;13046:308;;;:::o;6385:306::-;6535:28;6545:4;6551:2;6555:7;6535:9;:28::i;:::-;6581:47;6604:4;6610:2;6614:7;6623:4;6581:22;:47::i;:::-;6573:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6385:306;;;;:::o;410:696:13:-;466:13;515:14;552:1;532:17;543:5;532:10;:17::i;:::-;:21;515:38;;567:20;601:6;590:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;567:41;;622:11;748:6;744:2;740:15;732:6;728:28;721:35;;783:280;790:4;783:280;;;814:5;;;;;;;;953:8;948:2;941:5;937:14;932:30;927:3;919:44;1007:2;998:11;;;;;;:::i;:::-;;;;;1040:1;1031:5;:10;783:280;1027:21;783:280;1083:6;1076:13;;;;;410:696;;;:::o;829:155:2:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;11391:1236:3:-;11545:4;11518:31;;:23;11533:7;11518:14;:23::i;:::-;:31;;;11510:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;11624:1;11610:16;;:2;:16;;;11602:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;11679:42;11700:4;11706:2;11710:7;11719:1;11679:20;:42::i;:::-;11848:4;11821:31;;:23;11836:7;11821:14;:23::i;:::-;:31;;;11813:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;11964:15;:24;11980:7;11964:24;;;;;;;;;;;;11957:31;;;;;;;;;;;12451:1;12432:9;:15;12442:4;12432:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;12483:1;12466:9;:13;12476:2;12466:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;12523:2;12504:7;:16;12512:7;12504:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;12560:7;12556:2;12541:27;;12550:4;12541:27;;;;;;;;;;;;12579:41;12599:4;12605:2;12609:7;12618:1;12579:19;:41::i;:::-;11391:1236;;;:::o;8094:108::-;8169:26;8179:2;8183:7;8169:26;;;;;;;;;;;;:9;:26::i;:::-;8094:108;;:::o;14125:832::-;14274:4;14294:15;:2;:13;;;:15::i;:::-;14290:661;;;14345:2;14329:36;;;14366:12;:10;:12::i;:::-;14380:4;14386:7;14395:4;14329:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;14325:574;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14584:1;14567:6;:13;:18;14563:322;;14609:61;;;;;;;;;;:::i;:::-;;;;;;;;14563:322;14837:6;14831:13;14822:6;14818:2;14814:15;14807:38;14325:574;14460:41;;;14450:51;;;:6;:51;;;;14443:58;;;;;14290:661;14936:4;14929:11;;14125:832;;;;;;;:::o;9889:890:9:-;9942:7;9961:14;9978:1;9961:18;;10026:6;10017:5;:15;10013:99;;10061:6;10052:15;;;;;;:::i;:::-;;;;;10095:2;10085:12;;;;10013:99;10138:6;10129:5;:15;10125:99;;10173:6;10164:15;;;;;;:::i;:::-;;;;;10207:2;10197:12;;;;10125:99;10250:6;10241:5;:15;10237:99;;10285:6;10276:15;;;;;;:::i;:::-;;;;;10319:2;10309:12;;;;10237:99;10362:5;10353;:14;10349:96;;10396:5;10387:14;;;;;;:::i;:::-;;;;;10429:1;10419:11;;;;10349:96;10471:5;10462;:14;10458:96;;10505:5;10496:14;;;;;;:::i;:::-;;;;;10538:1;10528:11;;;;10458:96;10580:5;10571;:14;10567:96;;10614:5;10605:14;;;;;;:::i;:::-;;;;;10647:1;10637:11;;;;10567:96;10689:5;10680;:14;10676:64;;10724:1;10714:11;;;;10676:64;10766:6;10759:13;;;9889:890;;;:::o;15673:154:3:-;;;;;:::o;16533:153::-;;;;;:::o;8424:310::-;8548:18;8554:2;8558:7;8548:5;:18::i;:::-;8597:53;8628:1;8632:2;8636:7;8645:4;8597:22;:53::i;:::-;8576:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;8424:310;;;:::o;1175:320:0:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;9056:923:3:-;9149:1;9135:16;;:2;:16;;;9127:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;9208:16;9216:7;9208;:16::i;:::-;9207:17;9199:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;9269:48;9298:1;9302:2;9306:7;9315:1;9269:20;:48::i;:::-;9413:16;9421:7;9413;:16::i;:::-;9412:17;9404:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;9822:1;9805:9;:13;9815:2;9805:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;9863:2;9844:7;:16;9852:7;9844:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9906:7;9902:2;9881:33;;9898:1;9881:33;;;;;;;;;;;;9925:47;9953:1;9957:2;9961:7;9970:1;9925:19;:47::i;:::-;9056:923;;:::o;7:75:14:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:329::-;5301:6;5350:2;5338:9;5329:7;5325:23;5321:32;5318:119;;;5356:79;;:::i;:::-;5318:119;5476:1;5501:53;5546:7;5537:6;5526:9;5522:22;5501:53;:::i;:::-;5491:63;;5447:117;5242:329;;;;:::o;5577:619::-;5654:6;5662;5670;5719:2;5707:9;5698:7;5694:23;5690:32;5687:119;;;5725:79;;:::i;:::-;5687:119;5845:1;5870:53;5915:7;5906:6;5895:9;5891:22;5870:53;:::i;:::-;5860:63;;5816:117;5972:2;5998:53;6043:7;6034:6;6023:9;6019:22;5998:53;:::i;:::-;5988:63;;5943:118;6100:2;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6071:118;5577:619;;;;;:::o;6202:116::-;6272:21;6287:5;6272:21;:::i;:::-;6265:5;6262:32;6252:60;;6308:1;6305;6298:12;6252:60;6202:116;:::o;6324:133::-;6367:5;6405:6;6392:20;6383:29;;6421:30;6445:5;6421:30;:::i;:::-;6324:133;;;;:::o;6463:323::-;6519:6;6568:2;6556:9;6547:7;6543:23;6539:32;6536:119;;;6574:79;;:::i;:::-;6536:119;6694:1;6719:50;6761:7;6752:6;6741:9;6737:22;6719:50;:::i;:::-;6709:60;;6665:114;6463:323;;;;:::o;6792:619::-;6869:6;6877;6885;6934:2;6922:9;6913:7;6909:23;6905:32;6902:119;;;6940:79;;:::i;:::-;6902:119;7060:1;7085:53;7130:7;7121:6;7110:9;7106:22;7085:53;:::i;:::-;7075:63;;7031:117;7187:2;7213:53;7258:7;7249:6;7238:9;7234:22;7213:53;:::i;:::-;7203:63;;7158:118;7315:2;7341:53;7386:7;7377:6;7366:9;7362:22;7341:53;:::i;:::-;7331:63;;7286:118;6792:619;;;;;:::o;7417:474::-;7485:6;7493;7542:2;7530:9;7521:7;7517:23;7513:32;7510:119;;;7548:79;;:::i;:::-;7510:119;7668:1;7693:53;7738:7;7729:6;7718:9;7714:22;7693:53;:::i;:::-;7683:63;;7639:117;7795:2;7821:53;7866:7;7857:6;7846:9;7842:22;7821:53;:::i;:::-;7811:63;;7766:118;7417:474;;;;;:::o;7897:332::-;8018:4;8056:2;8045:9;8041:18;8033:26;;8069:71;8137:1;8126:9;8122:17;8113:6;8069:71;:::i;:::-;8150:72;8218:2;8207:9;8203:18;8194:6;8150:72;:::i;:::-;7897:332;;;;;:::o;8235:468::-;8300:6;8308;8357:2;8345:9;8336:7;8332:23;8328:32;8325:119;;;8363:79;;:::i;:::-;8325:119;8483:1;8508:53;8553:7;8544:6;8533:9;8529:22;8508:53;:::i;:::-;8498:63;;8454:117;8610:2;8636:50;8678:7;8669:6;8658:9;8654:22;8636:50;:::i;:::-;8626:60;;8581:115;8235:468;;;;;:::o;8709:743::-;8928:4;8966:3;8955:9;8951:19;8943:27;;9016:9;9010:4;9006:20;9002:1;8991:9;8987:17;8980:47;9044:78;9117:4;9108:6;9044:78;:::i;:::-;9036:86;;9132:72;9200:2;9189:9;9185:18;9176:6;9132:72;:::i;:::-;9214;9282:2;9271:9;9267:18;9258:6;9214:72;:::i;:::-;9296;9364:2;9353:9;9349:18;9340:6;9296:72;:::i;:::-;9378:67;9440:3;9429:9;9425:19;9416:6;9378:67;:::i;:::-;8709:743;;;;;;;;:::o;9458:117::-;9567:1;9564;9557:12;9581:117;9690:1;9687;9680:12;9704:180;9752:77;9749:1;9742:88;9849:4;9846:1;9839:15;9873:4;9870:1;9863:15;9890:281;9973:27;9995:4;9973:27;:::i;:::-;9965:6;9961:40;10103:6;10091:10;10088:22;10067:18;10055:10;10052:34;10049:62;10046:88;;;10114:18;;:::i;:::-;10046:88;10154:10;10150:2;10143:22;9933:238;9890:281;;:::o;10177:129::-;10211:6;10238:20;;:::i;:::-;10228:30;;10267:33;10295:4;10287:6;10267:33;:::i;:::-;10177:129;;;:::o;10312:308::-;10374:4;10464:18;10456:6;10453:30;10450:56;;;10486:18;;:::i;:::-;10450:56;10524:29;10546:6;10524:29;:::i;:::-;10516:37;;10608:4;10602;10598:15;10590:23;;10312:308;;;:::o;10626:146::-;10723:6;10718:3;10713;10700:30;10764:1;10755:6;10750:3;10746:16;10739:27;10626:146;;;:::o;10778:425::-;10856:5;10881:66;10897:49;10939:6;10897:49;:::i;:::-;10881:66;:::i;:::-;10872:75;;10970:6;10963:5;10956:21;11008:4;11001:5;10997:16;11046:3;11037:6;11032:3;11028:16;11025:25;11022:112;;;11053:79;;:::i;:::-;11022:112;11143:54;11190:6;11185:3;11180;11143:54;:::i;:::-;10862:341;10778:425;;;;;:::o;11223:340::-;11279:5;11328:3;11321:4;11313:6;11309:17;11305:27;11295:122;;11336:79;;:::i;:::-;11295:122;11453:6;11440:20;11478:79;11553:3;11545:6;11538:4;11530:6;11526:17;11478:79;:::i;:::-;11469:88;;11285:278;11223:340;;;;:::o;11569:509::-;11638:6;11687:2;11675:9;11666:7;11662:23;11658:32;11655:119;;;11693:79;;:::i;:::-;11655:119;11841:1;11830:9;11826:17;11813:31;11871:18;11863:6;11860:30;11857:117;;;11893:79;;:::i;:::-;11857:117;11998:63;12053:7;12044:6;12033:9;12029:22;11998:63;:::i;:::-;11988:73;;11784:287;11569:509;;;;:::o;12084:613::-;12158:6;12166;12174;12223:2;12211:9;12202:7;12198:23;12194:32;12191:119;;;12229:79;;:::i;:::-;12191:119;12349:1;12374:53;12419:7;12410:6;12399:9;12395:22;12374:53;:::i;:::-;12364:63;;12320:117;12476:2;12502:53;12547:7;12538:6;12527:9;12523:22;12502:53;:::i;:::-;12492:63;;12447:118;12604:2;12630:50;12672:7;12663:6;12652:9;12648:22;12630:50;:::i;:::-;12620:60;;12575:115;12084:613;;;;;:::o;12703:945::-;12799:6;12807;12815;12823;12872:3;12860:9;12851:7;12847:23;12843:33;12840:120;;;12879:79;;:::i;:::-;12840:120;12999:1;13024:53;13069:7;13060:6;13049:9;13045:22;13024:53;:::i;:::-;13014:63;;12970:117;13154:2;13143:9;13139:18;13126:32;13185:18;13177:6;13174:30;13171:117;;;13207:79;;:::i;:::-;13171:117;13312:63;13367:7;13358:6;13347:9;13343:22;13312:63;:::i;:::-;13302:73;;13097:288;13424:2;13450:53;13495:7;13486:6;13475:9;13471:22;13450:53;:::i;:::-;13440:63;;13395:118;13552:2;13578:53;13623:7;13614:6;13603:9;13599:22;13578:53;:::i;:::-;13568:63;;13523:118;12703:945;;;;;;;:::o;13654:114::-;13721:6;13755:5;13749:12;13739:22;;13654:114;;;:::o;13774:184::-;13873:11;13907:6;13902:3;13895:19;13947:4;13942:3;13938:14;13923:29;;13774:184;;;;:::o;13964:132::-;14031:4;14054:3;14046:11;;14084:4;14079:3;14075:14;14067:22;;13964:132;;;:::o;14102:108::-;14179:24;14197:5;14179:24;:::i;:::-;14174:3;14167:37;14102:108;;:::o;14216:179::-;14285:10;14306:46;14348:3;14340:6;14306:46;:::i;:::-;14384:4;14379:3;14375:14;14361:28;;14216:179;;;;:::o;14401:113::-;14471:4;14503;14498:3;14494:14;14486:22;;14401:113;;;:::o;14550:732::-;14669:3;14698:54;14746:5;14698:54;:::i;:::-;14768:86;14847:6;14842:3;14768:86;:::i;:::-;14761:93;;14878:56;14928:5;14878:56;:::i;:::-;14957:7;14988:1;14973:284;14998:6;14995:1;14992:13;14973:284;;;15074:6;15068:13;15101:63;15160:3;15145:13;15101:63;:::i;:::-;15094:70;;15187:60;15240:6;15187:60;:::i;:::-;15177:70;;15033:224;15020:1;15017;15013:9;15008:14;;14973:284;;;14977:14;15273:3;15266:10;;14674:608;;;14550:732;;;;:::o;15288:471::-;15453:4;15491:2;15480:9;15476:18;15468:26;;15504:65;15566:1;15555:9;15551:17;15542:6;15504:65;:::i;:::-;15616:9;15610:4;15606:20;15601:2;15590:9;15586:18;15579:48;15644:108;15747:4;15738:6;15644:108;:::i;:::-;15636:116;;15288:471;;;;;:::o;15765:474::-;15833:6;15841;15890:2;15878:9;15869:7;15865:23;15861:32;15858:119;;;15896:79;;:::i;:::-;15858:119;16016:1;16041:53;16086:7;16077:6;16066:9;16062:22;16041:53;:::i;:::-;16031:63;;15987:117;16143:2;16169:53;16214:7;16205:6;16194:9;16190:22;16169:53;:::i;:::-;16159:63;;16114:118;15765:474;;;;;:::o;16245:468::-;16310:6;16318;16367:2;16355:9;16346:7;16342:23;16338:32;16335:119;;;16373:79;;:::i;:::-;16335:119;16493:1;16518:53;16563:7;16554:6;16543:9;16539:22;16518:53;:::i;:::-;16508:63;;16464:117;16620:2;16646:50;16688:7;16679:6;16668:9;16664:22;16646:50;:::i;:::-;16636:60;;16591:115;16245:468;;;;;:::o;16719:307::-;16780:4;16870:18;16862:6;16859:30;16856:56;;;16892:18;;:::i;:::-;16856:56;16930:29;16952:6;16930:29;:::i;:::-;16922:37;;17014:4;17008;17004:15;16996:23;;16719:307;;;:::o;17032:423::-;17109:5;17134:65;17150:48;17191:6;17150:48;:::i;:::-;17134:65;:::i;:::-;17125:74;;17222:6;17215:5;17208:21;17260:4;17253:5;17249:16;17298:3;17289:6;17284:3;17280:16;17277:25;17274:112;;;17305:79;;:::i;:::-;17274:112;17395:54;17442:6;17437:3;17432;17395:54;:::i;:::-;17115:340;17032:423;;;;;:::o;17474:338::-;17529:5;17578:3;17571:4;17563:6;17559:17;17555:27;17545:122;;17586:79;;:::i;:::-;17545:122;17703:6;17690:20;17728:78;17802:3;17794:6;17787:4;17779:6;17775:17;17728:78;:::i;:::-;17719:87;;17535:277;17474:338;;;;:::o;17818:943::-;17913:6;17921;17929;17937;17986:3;17974:9;17965:7;17961:23;17957:33;17954:120;;;17993:79;;:::i;:::-;17954:120;18113:1;18138:53;18183:7;18174:6;18163:9;18159:22;18138:53;:::i;:::-;18128:63;;18084:117;18240:2;18266:53;18311:7;18302:6;18291:9;18287:22;18266:53;:::i;:::-;18256:63;;18211:118;18368:2;18394:53;18439:7;18430:6;18419:9;18415:22;18394:53;:::i;:::-;18384:63;;18339:118;18524:2;18513:9;18509:18;18496:32;18555:18;18547:6;18544:30;18541:117;;;18577:79;;:::i;:::-;18541:117;18682:62;18736:7;18727:6;18716:9;18712:22;18682:62;:::i;:::-;18672:72;;18467:287;17818:943;;;;;;;:::o;18767:474::-;18835:6;18843;18892:2;18880:9;18871:7;18867:23;18863:32;18860:119;;;18898:79;;:::i;:::-;18860:119;19018:1;19043:53;19088:7;19079:6;19068:9;19064:22;19043:53;:::i;:::-;19033:63;;18989:117;19145:2;19171:53;19216:7;19207:6;19196:9;19192:22;19171:53;:::i;:::-;19161:63;;19116:118;18767:474;;;;;:::o;19247:180::-;19295:77;19292:1;19285:88;19392:4;19389:1;19382:15;19416:4;19413:1;19406:15;19433:320;19477:6;19514:1;19508:4;19504:12;19494:22;;19561:1;19555:4;19551:12;19582:18;19572:81;;19638:4;19630:6;19626:17;19616:27;;19572:81;19700:2;19692:6;19689:14;19669:18;19666:38;19663:84;;19719:18;;:::i;:::-;19663:84;19484:269;19433:320;;;:::o;19759:221::-;19899:34;19895:1;19887:6;19883:14;19876:58;19968:4;19963:2;19955:6;19951:15;19944:29;19759:221;:::o;19986:366::-;20128:3;20149:67;20213:2;20208:3;20149:67;:::i;:::-;20142:74;;20225:93;20314:3;20225:93;:::i;:::-;20343:2;20338:3;20334:12;20327:19;;19986:366;;;:::o;20358:419::-;20524:4;20562:2;20551:9;20547:18;20539:26;;20611:9;20605:4;20601:20;20597:1;20586:9;20582:17;20575:47;20639:131;20765:4;20639:131;:::i;:::-;20631:139;;20358:419;;;:::o;20783:249::-;20923:34;20919:1;20911:6;20907:14;20900:58;20992:32;20987:2;20979:6;20975:15;20968:57;20783:249;:::o;21038:366::-;21180:3;21201:67;21265:2;21260:3;21201:67;:::i;:::-;21194:74;;21277:93;21366:3;21277:93;:::i;:::-;21395:2;21390:3;21386:12;21379:19;;21038:366;;;:::o;21410:419::-;21576:4;21614:2;21603:9;21599:18;21591:26;;21663:9;21657:4;21653:20;21649:1;21638:9;21634:17;21627:47;21691:131;21817:4;21691:131;:::i;:::-;21683:139;;21410:419;;;:::o;21835:234::-;21975:34;21971:1;21963:6;21959:14;21952:58;22044:17;22039:2;22031:6;22027:15;22020:42;21835:234;:::o;22075:366::-;22217:3;22238:67;22302:2;22297:3;22238:67;:::i;:::-;22231:74;;22314:93;22403:3;22314:93;:::i;:::-;22432:2;22427:3;22423:12;22416:19;;22075:366;;;:::o;22447:419::-;22613:4;22651:2;22640:9;22636:18;22628:26;;22700:9;22694:4;22690:20;22686:1;22675:9;22671:17;22664:47;22728:131;22854:4;22728:131;:::i;:::-;22720:139;;22447:419;;;:::o;22872:222::-;23012:34;23008:1;23000:6;22996:14;22989:58;23081:5;23076:2;23068:6;23064:15;23057:30;22872:222;:::o;23100:366::-;23242:3;23263:67;23327:2;23322:3;23263:67;:::i;:::-;23256:74;;23339:93;23428:3;23339:93;:::i;:::-;23457:2;23452:3;23448:12;23441:19;;23100:366;;;:::o;23472:419::-;23638:4;23676:2;23665:9;23661:18;23653:26;;23725:9;23719:4;23715:20;23711:1;23700:9;23696:17;23689:47;23753:131;23879:4;23753:131;:::i;:::-;23745:139;;23472:419;;;:::o;23897:233::-;24037:34;24033:1;24025:6;24021:14;24014:58;24106:16;24101:2;24093:6;24089:15;24082:41;23897:233;:::o;24136:366::-;24278:3;24299:67;24363:2;24358:3;24299:67;:::i;:::-;24292:74;;24375:93;24464:3;24375:93;:::i;:::-;24493:2;24488:3;24484:12;24477:19;;24136:366;;;:::o;24508:419::-;24674:4;24712:2;24701:9;24697:18;24689:26;;24761:9;24755:4;24751:20;24747:1;24736:9;24732:17;24725:47;24789:131;24915:4;24789:131;:::i;:::-;24781:139;;24508:419;;;:::o;24933:180::-;24981:77;24978:1;24971:88;25078:4;25075:1;25068:15;25102:4;25099:1;25092:15;25119:410;25159:7;25182:20;25200:1;25182:20;:::i;:::-;25177:25;;25216:20;25234:1;25216:20;:::i;:::-;25211:25;;25271:1;25268;25264:9;25293:30;25311:11;25293:30;:::i;:::-;25282:41;;25472:1;25463:7;25459:15;25456:1;25453:22;25433:1;25426:9;25406:83;25383:139;;25502:18;;:::i;:::-;25383:139;25167:362;25119:410;;;;:::o;25535:180::-;25583:77;25580:1;25573:88;25680:4;25677:1;25670:15;25704:4;25701:1;25694:15;25721:185;25761:1;25778:20;25796:1;25778:20;:::i;:::-;25773:25;;25812:20;25830:1;25812:20;:::i;:::-;25807:25;;25851:1;25841:35;;25856:18;;:::i;:::-;25841:35;25898:1;25895;25891:9;25886:14;;25721:185;;;;:::o;25912:194::-;25952:4;25972:20;25990:1;25972:20;:::i;:::-;25967:25;;26006:20;26024:1;26006:20;:::i;:::-;26001:25;;26050:1;26047;26043:9;26035:17;;26074:1;26068:4;26065:11;26062:37;;;26079:18;;:::i;:::-;26062:37;25912:194;;;;:::o;26112:141::-;26161:4;26184:3;26176:11;;26207:3;26204:1;26197:14;26241:4;26238:1;26228:18;26220:26;;26112:141;;;:::o;26259:93::-;26296:6;26343:2;26338;26331:5;26327:14;26323:23;26313:33;;26259:93;;;:::o;26358:107::-;26402:8;26452:5;26446:4;26442:16;26421:37;;26358:107;;;;:::o;26471:393::-;26540:6;26590:1;26578:10;26574:18;26613:97;26643:66;26632:9;26613:97;:::i;:::-;26731:39;26761:8;26750:9;26731:39;:::i;:::-;26719:51;;26803:4;26799:9;26792:5;26788:21;26779:30;;26852:4;26842:8;26838:19;26831:5;26828:30;26818:40;;26547:317;;26471:393;;;;;:::o;26870:60::-;26898:3;26919:5;26912:12;;26870:60;;;:::o;26936:142::-;26986:9;27019:53;27037:34;27046:24;27064:5;27046:24;:::i;:::-;27037:34;:::i;:::-;27019:53;:::i;:::-;27006:66;;26936:142;;;:::o;27084:75::-;27127:3;27148:5;27141:12;;27084:75;;;:::o;27165:269::-;27275:39;27306:7;27275:39;:::i;:::-;27336:91;27385:41;27409:16;27385:41;:::i;:::-;27377:6;27370:4;27364:11;27336:91;:::i;:::-;27330:4;27323:105;27241:193;27165:269;;;:::o;27440:73::-;27485:3;27440:73;:::o;27519:189::-;27596:32;;:::i;:::-;27637:65;27695:6;27687;27681:4;27637:65;:::i;:::-;27572:136;27519:189;;:::o;27714:186::-;27774:120;27791:3;27784:5;27781:14;27774:120;;;27845:39;27882:1;27875:5;27845:39;:::i;:::-;27818:1;27811:5;27807:13;27798:22;;27774:120;;;27714:186;;:::o;27906:543::-;28007:2;28002:3;27999:11;27996:446;;;28041:38;28073:5;28041:38;:::i;:::-;28125:29;28143:10;28125:29;:::i;:::-;28115:8;28111:44;28308:2;28296:10;28293:18;28290:49;;;28329:8;28314:23;;28290:49;28352:80;28408:22;28426:3;28408:22;:::i;:::-;28398:8;28394:37;28381:11;28352:80;:::i;:::-;28011:431;;27996:446;27906:543;;;:::o;28455:117::-;28509:8;28559:5;28553:4;28549:16;28528:37;;28455:117;;;;:::o;28578:169::-;28622:6;28655:51;28703:1;28699:6;28691:5;28688:1;28684:13;28655:51;:::i;:::-;28651:56;28736:4;28730;28726:15;28716:25;;28629:118;28578:169;;;;:::o;28752:295::-;28828:4;28974:29;28999:3;28993:4;28974:29;:::i;:::-;28966:37;;29036:3;29033:1;29029:11;29023:4;29020:21;29012:29;;28752:295;;;;:::o;29052:1395::-;29169:37;29202:3;29169:37;:::i;:::-;29271:18;29263:6;29260:30;29257:56;;;29293:18;;:::i;:::-;29257:56;29337:38;29369:4;29363:11;29337:38;:::i;:::-;29422:67;29482:6;29474;29468:4;29422:67;:::i;:::-;29516:1;29540:4;29527:17;;29572:2;29564:6;29561:14;29589:1;29584:618;;;;30246:1;30263:6;30260:77;;;30312:9;30307:3;30303:19;30297:26;30288:35;;30260:77;30363:67;30423:6;30416:5;30363:67;:::i;:::-;30357:4;30350:81;30219:222;29554:887;;29584:618;29636:4;29632:9;29624:6;29620:22;29670:37;29702:4;29670:37;:::i;:::-;29729:1;29743:208;29757:7;29754:1;29751:14;29743:208;;;29836:9;29831:3;29827:19;29821:26;29813:6;29806:42;29887:1;29879:6;29875:14;29865:24;;29934:2;29923:9;29919:18;29906:31;;29780:4;29777:1;29773:12;29768:17;;29743:208;;;29979:6;29970:7;29967:19;29964:179;;;30037:9;30032:3;30028:19;30022:26;30080:48;30122:4;30114:6;30110:17;30099:9;30080:48;:::i;:::-;30072:6;30065:64;29987:156;29964:179;30189:1;30185;30177:6;30173:14;30169:22;30163:4;30156:36;29591:611;;;29554:887;;29144:1303;;;29052:1395;;:::o;30453:235::-;30593:34;30589:1;30581:6;30577:14;30570:58;30662:18;30657:2;30649:6;30645:15;30638:43;30453:235;:::o;30694:366::-;30836:3;30857:67;30921:2;30916:3;30857:67;:::i;:::-;30850:74;;30933:93;31022:3;30933:93;:::i;:::-;31051:2;31046:3;31042:12;31035:19;;30694:366;;;:::o;31066:419::-;31232:4;31270:2;31259:9;31255:18;31247:26;;31319:9;31313:4;31309:20;31305:1;31294:9;31290:17;31283:47;31347:131;31473:4;31347:131;:::i;:::-;31339:139;;31066:419;;;:::o;31491:165::-;31631:17;31627:1;31619:6;31615:14;31608:41;31491:165;:::o;31662:366::-;31804:3;31825:67;31889:2;31884:3;31825:67;:::i;:::-;31818:74;;31901:93;31990:3;31901:93;:::i;:::-;32019:2;32014:3;32010:12;32003:19;;31662:366;;;:::o;32034:419::-;32200:4;32238:2;32227:9;32223:18;32215:26;;32287:9;32281:4;32277:20;32273:1;32262:9;32258:17;32251:47;32315:131;32441:4;32315:131;:::i;:::-;32307:139;;32034:419;;;:::o;32459:191::-;32499:3;32518:20;32536:1;32518:20;:::i;:::-;32513:25;;32552:20;32570:1;32552:20;:::i;:::-;32547:25;;32595:1;32592;32588:9;32581:16;;32616:3;32613:1;32610:10;32607:36;;;32623:18;;:::i;:::-;32607:36;32459:191;;;;:::o;32656:173::-;32796:25;32792:1;32784:6;32780:14;32773:49;32656:173;:::o;32835:366::-;32977:3;32998:67;33062:2;33057:3;32998:67;:::i;:::-;32991:74;;33074:93;33163:3;33074:93;:::i;:::-;33192:2;33187:3;33183:12;33176:19;;32835:366;;;:::o;33207:419::-;33373:4;33411:2;33400:9;33396:18;33388:26;;33460:9;33454:4;33450:20;33446:1;33435:9;33431:17;33424:47;33488:131;33614:4;33488:131;:::i;:::-;33480:139;;33207:419;;;:::o;33632:174::-;33772:26;33768:1;33760:6;33756:14;33749:50;33632:174;:::o;33812:366::-;33954:3;33975:67;34039:2;34034:3;33975:67;:::i;:::-;33968:74;;34051:93;34140:3;34051:93;:::i;:::-;34169:2;34164:3;34160:12;34153:19;;33812:366;;;:::o;34184:419::-;34350:4;34388:2;34377:9;34373:18;34365:26;;34437:9;34431:4;34427:20;34423:1;34412:9;34408:17;34401:47;34465:131;34591:4;34465:131;:::i;:::-;34457:139;;34184:419;;;:::o;34609:178::-;34749:30;34745:1;34737:6;34733:14;34726:54;34609:178;:::o;34793:366::-;34935:3;34956:67;35020:2;35015:3;34956:67;:::i;:::-;34949:74;;35032:93;35121:3;35032:93;:::i;:::-;35150:2;35145:3;35141:12;35134:19;;34793:366;;;:::o;35165:419::-;35331:4;35369:2;35358:9;35354:18;35346:26;;35418:9;35412:4;35408:20;35404:1;35393:9;35389:17;35382:47;35446:131;35572:4;35446:131;:::i;:::-;35438:139;;35165:419;;;:::o;35590:181::-;35730:33;35726:1;35718:6;35714:14;35707:57;35590:181;:::o;35777:366::-;35919:3;35940:67;36004:2;35999:3;35940:67;:::i;:::-;35933:74;;36016:93;36105:3;36016:93;:::i;:::-;36134:2;36129:3;36125:12;36118:19;;35777:366;;;:::o;36149:419::-;36315:4;36353:2;36342:9;36338:18;36330:26;;36402:9;36396:4;36392:20;36388:1;36377:9;36373:17;36366:47;36430:131;36556:4;36430:131;:::i;:::-;36422:139;;36149:419;;;:::o;36574:227::-;36714:34;36710:1;36702:6;36698:14;36691:58;36783:10;36778:2;36770:6;36766:15;36759:35;36574:227;:::o;36807:366::-;36949:3;36970:67;37034:2;37029:3;36970:67;:::i;:::-;36963:74;;37046:93;37135:3;37046:93;:::i;:::-;37164:2;37159:3;37155:12;37148:19;;36807:366;;;:::o;37179:419::-;37345:4;37383:2;37372:9;37368:18;37360:26;;37432:9;37426:4;37422:20;37418:1;37407:9;37403:17;37396:47;37460:131;37586:4;37460:131;:::i;:::-;37452:139;;37179:419;;;:::o;37604:176::-;37744:28;37740:1;37732:6;37728:14;37721:52;37604:176;:::o;37786:366::-;37928:3;37949:67;38013:2;38008:3;37949:67;:::i;:::-;37942:74;;38025:93;38114:3;38025:93;:::i;:::-;38143:2;38138:3;38134:12;38127:19;;37786:366;;;:::o;38158:419::-;38324:4;38362:2;38351:9;38347:18;38339:26;;38411:9;38405:4;38401:20;38397:1;38386:9;38382:17;38375:47;38439:131;38565:4;38439:131;:::i;:::-;38431:139;;38158:419;;;:::o;38583:175::-;38723:27;38719:1;38711:6;38707:14;38700:51;38583:175;:::o;38764:366::-;38906:3;38927:67;38991:2;38986:3;38927:67;:::i;:::-;38920:74;;39003:93;39092:3;39003:93;:::i;:::-;39121:2;39116:3;39112:12;39105:19;;38764:366;;;:::o;39136:419::-;39302:4;39340:2;39329:9;39325:18;39317:26;;39389:9;39383:4;39379:20;39375:1;39364:9;39360:17;39353:47;39417:131;39543:4;39417:131;:::i;:::-;39409:139;;39136:419;;;:::o;39561:172::-;39701:24;39697:1;39689:6;39685:14;39678:48;39561:172;:::o;39739:366::-;39881:3;39902:67;39966:2;39961:3;39902:67;:::i;:::-;39895:74;;39978:93;40067:3;39978:93;:::i;:::-;40096:2;40091:3;40087:12;40080:19;;39739:366;;;:::o;40111:419::-;40277:4;40315:2;40304:9;40300:18;40292:26;;40364:9;40358:4;40354:20;40350:1;40339:9;40335:17;40328:47;40392:131;40518:4;40392:131;:::i;:::-;40384:139;;40111:419;;;:::o;40536:232::-;40676:34;40672:1;40664:6;40660:14;40653:58;40745:15;40740:2;40732:6;40728:15;40721:40;40536:232;:::o;40774:366::-;40916:3;40937:67;41001:2;40996:3;40937:67;:::i;:::-;40930:74;;41013:93;41102:3;41013:93;:::i;:::-;41131:2;41126:3;41122:12;41115:19;;40774:366;;;:::o;41146:419::-;41312:4;41350:2;41339:9;41335:18;41327:26;;41399:9;41393:4;41389:20;41385:1;41374:9;41370:17;41363:47;41427:131;41553:4;41427:131;:::i;:::-;41419:139;;41146:419;;;:::o;41571:229::-;41711:34;41707:1;41699:6;41695:14;41688:58;41780:12;41775:2;41767:6;41763:15;41756:37;41571:229;:::o;41806:366::-;41948:3;41969:67;42033:2;42028:3;41969:67;:::i;:::-;41962:74;;42045:93;42134:3;42045:93;:::i;:::-;42163:2;42158:3;42154:12;42147:19;;41806:366;;;:::o;42178:419::-;42344:4;42382:2;42371:9;42367:18;42359:26;;42431:9;42425:4;42421:20;42417:1;42406:9;42402:17;42395:47;42459:131;42585:4;42459:131;:::i;:::-;42451:139;;42178:419;;;:::o;42603:181::-;42743:33;42739:1;42731:6;42727:14;42720:57;42603:181;:::o;42790:366::-;42932:3;42953:67;43017:2;43012:3;42953:67;:::i;:::-;42946:74;;43029:93;43118:3;43029:93;:::i;:::-;43147:2;43142:3;43138:12;43131:19;;42790:366;;;:::o;43162:419::-;43328:4;43366:2;43355:9;43351:18;43343:26;;43415:9;43409:4;43405:20;43401:1;43390:9;43386:17;43379:47;43443:131;43569:4;43443:131;:::i;:::-;43435:139;;43162:419;;;:::o;43587:233::-;43626:3;43649:24;43667:5;43649:24;:::i;:::-;43640:33;;43695:66;43688:5;43685:77;43682:103;;43765:18;;:::i;:::-;43682:103;43812:1;43805:5;43801:13;43794:20;;43587:233;;;:::o;43826:248::-;43966:34;43962:1;43954:6;43950:14;43943:58;44035:31;44030:2;44022:6;44018:15;44011:56;43826:248;:::o;44080:366::-;44222:3;44243:67;44307:2;44302:3;44243:67;:::i;:::-;44236:74;;44319:93;44408:3;44319:93;:::i;:::-;44437:2;44432:3;44428:12;44421:19;;44080:366;;;:::o;44452:419::-;44618:4;44656:2;44645:9;44641:18;44633:26;;44705:9;44699:4;44695:20;44691:1;44680:9;44676:17;44669:47;44733:131;44859:4;44733:131;:::i;:::-;44725:139;;44452:419;;;:::o;44877:143::-;44934:5;44965:6;44959:13;44950:22;;44981:33;45008:5;44981:33;:::i;:::-;44877:143;;;;:::o;45026:351::-;45096:6;45145:2;45133:9;45124:7;45120:23;45116:32;45113:119;;;45151:79;;:::i;:::-;45113:119;45271:1;45296:64;45352:7;45343:6;45332:9;45328:22;45296:64;:::i;:::-;45286:74;;45242:128;45026:351;;;;:::o;45383:148::-;45485:11;45522:3;45507:18;;45383:148;;;;:::o;45561:874::-;45664:3;45701:5;45695:12;45730:36;45756:9;45730:36;:::i;:::-;45782:89;45864:6;45859:3;45782:89;:::i;:::-;45775:96;;45902:1;45891:9;45887:17;45918:1;45913:166;;;;46093:1;46088:341;;;;45880:549;;45913:166;45997:4;45993:9;45982;45978:25;45973:3;45966:38;46059:6;46052:14;46045:22;46037:6;46033:35;46028:3;46024:45;46017:52;;45913:166;;46088:341;46155:38;46187:5;46155:38;:::i;:::-;46215:1;46229:154;46243:6;46240:1;46237:13;46229:154;;;46317:7;46311:14;46307:1;46302:3;46298:11;46291:35;46367:1;46358:7;46354:15;46343:26;;46265:4;46262:1;46258:12;46253:17;;46229:154;;;46412:6;46407:3;46403:16;46396:23;;46095:334;;45880:549;;45668:767;;45561:874;;;;:::o;46441:162::-;46581:14;46577:1;46569:6;46565:14;46558:38;46441:162;:::o;46609:402::-;46769:3;46790:85;46872:2;46867:3;46790:85;:::i;:::-;46783:92;;46884:93;46973:3;46884:93;:::i;:::-;47002:2;46997:3;46993:12;46986:19;;46609:402;;;:::o;47017:535::-;47247:3;47269:92;47357:3;47348:6;47269:92;:::i;:::-;47262:99;;47378:148;47522:3;47378:148;:::i;:::-;47371:155;;47543:3;47536:10;;47017:535;;;;:::o;47558:151::-;47698:3;47694:1;47686:6;47682:14;47675:27;47558:151;:::o;47715:400::-;47875:3;47896:84;47978:1;47973:3;47896:84;:::i;:::-;47889:91;;47989:93;48078:3;47989:93;:::i;:::-;48107:1;48102:3;48098:11;48091:18;;47715:400;;;:::o;48121:390::-;48227:3;48255:39;48288:5;48255:39;:::i;:::-;48310:89;48392:6;48387:3;48310:89;:::i;:::-;48303:96;;48408:65;48466:6;48461:3;48454:4;48447:5;48443:16;48408:65;:::i;:::-;48498:6;48493:3;48489:16;48482:23;;48231:280;48121:390;;;;:::o;48517:164::-;48657:16;48653:1;48645:6;48641:14;48634:40;48517:164;:::o;48687:402::-;48847:3;48868:85;48950:2;48945:3;48868:85;:::i;:::-;48861:92;;48962:93;49051:3;48962:93;:::i;:::-;49080:2;49075:3;49071:12;49064:19;;48687:402;;;:::o;49095:1387::-;49623:3;49645:92;49733:3;49724:6;49645:92;:::i;:::-;49638:99;;49754:148;49898:3;49754:148;:::i;:::-;49747:155;;49919:95;50010:3;50001:6;49919:95;:::i;:::-;49912:102;;50031:148;50175:3;50031:148;:::i;:::-;50024:155;;50196:95;50287:3;50278:6;50196:95;:::i;:::-;50189:102;;50308:148;50452:3;50308:148;:::i;:::-;50301:155;;50473:3;50466:10;;49095:1387;;;;;;:::o;50488:174::-;50628:26;50624:1;50616:6;50612:14;50605:50;50488:174;:::o;50668:366::-;50810:3;50831:67;50895:2;50890:3;50831:67;:::i;:::-;50824:74;;50907:93;50996:3;50907:93;:::i;:::-;51025:2;51020:3;51016:12;51009:19;;50668:366;;;:::o;51040:419::-;51206:4;51244:2;51233:9;51229:18;51221:26;;51293:9;51287:4;51283:20;51279:1;51268:9;51264:17;51257:47;51321:131;51447:4;51321:131;:::i;:::-;51313:139;;51040:419;;;:::o;51465:225::-;51605:34;51601:1;51593:6;51589:14;51582:58;51674:8;51669:2;51661:6;51657:15;51650:33;51465:225;:::o;51696:366::-;51838:3;51859:67;51923:2;51918:3;51859:67;:::i;:::-;51852:74;;51935:93;52024:3;51935:93;:::i;:::-;52053:2;52048:3;52044:12;52037:19;;51696:366;;;:::o;52068:419::-;52234:4;52272:2;52261:9;52257:18;52249:26;;52321:9;52315:4;52311:20;52307:1;52296:9;52292:17;52285:47;52349:131;52475:4;52349:131;:::i;:::-;52341:139;;52068:419;;;:::o;52493:182::-;52633:34;52629:1;52621:6;52617:14;52610:58;52493:182;:::o;52681:366::-;52823:3;52844:67;52908:2;52903:3;52844:67;:::i;:::-;52837:74;;52920:93;53009:3;52920:93;:::i;:::-;53038:2;53033:3;53029:12;53022:19;;52681:366;;;:::o;53053:419::-;53219:4;53257:2;53246:9;53242:18;53234:26;;53306:9;53300:4;53296:20;53292:1;53281:9;53277:17;53270:47;53334:131;53460:4;53334:131;:::i;:::-;53326:139;;53053:419;;;:::o;53478:181::-;53618:33;53614:1;53606:6;53602:14;53595:57;53478:181;:::o;53665:366::-;53807:3;53828:67;53892:2;53887:3;53828:67;:::i;:::-;53821:74;;53904:93;53993:3;53904:93;:::i;:::-;54022:2;54017:3;54013:12;54006:19;;53665:366;;;:::o;54037:419::-;54203:4;54241:2;54230:9;54226:18;54218:26;;54290:9;54284:4;54280:20;54276:1;54265:9;54261:17;54254:47;54318:131;54444:4;54318:131;:::i;:::-;54310:139;;54037:419;;;:::o;54462:165::-;54602:17;54598:1;54590:6;54586:14;54579:41;54462:165;:::o;54633:366::-;54775:3;54796:67;54860:2;54855:3;54796:67;:::i;:::-;54789:74;;54872:93;54961:3;54872:93;:::i;:::-;54990:2;54985:3;54981:12;54974:19;;54633:366;;;:::o;55005:419::-;55171:4;55209:2;55198:9;55194:18;55186:26;;55258:9;55252:4;55248:20;55244:1;55233:9;55229:17;55222:47;55286:131;55412:4;55286:131;:::i;:::-;55278:139;;55005:419;;;:::o;55430:176::-;55570:28;55566:1;55558:6;55554:14;55547:52;55430:176;:::o;55612:366::-;55754:3;55775:67;55839:2;55834:3;55775:67;:::i;:::-;55768:74;;55851:93;55940:3;55851:93;:::i;:::-;55969:2;55964:3;55960:12;55953:19;;55612:366;;;:::o;55984:419::-;56150:4;56188:2;56177:9;56173:18;56165:26;;56237:9;56231:4;56227:20;56223:1;56212:9;56208:17;56201:47;56265:131;56391:4;56265:131;:::i;:::-;56257:139;;55984:419;;;:::o;56409:178::-;56549:30;56545:1;56537:6;56533:14;56526:54;56409:178;:::o;56593:366::-;56735:3;56756:67;56820:2;56815:3;56756:67;:::i;:::-;56749:74;;56832:93;56921:3;56832:93;:::i;:::-;56950:2;56945:3;56941:12;56934:19;;56593:366;;;:::o;56965:419::-;57131:4;57169:2;57158:9;57154:18;57146:26;;57218:9;57212:4;57208:20;57204:1;57193:9;57189:17;57182:47;57246:131;57372:4;57246:131;:::i;:::-;57238:139;;56965:419;;;:::o;57390:180::-;57438:77;57435:1;57428:88;57535:4;57532:1;57525:15;57559:4;57556:1;57549:15;57576:176;57716:28;57712:1;57704:6;57700:14;57693:52;57576:176;:::o;57758:366::-;57900:3;57921:67;57985:2;57980:3;57921:67;:::i;:::-;57914:74;;57997:93;58086:3;57997:93;:::i;:::-;58115:2;58110:3;58106:12;58099:19;;57758:366;;;:::o;58130:419::-;58296:4;58334:2;58323:9;58319:18;58311:26;;58383:9;58377:4;58373:20;58369:1;58358:9;58354:17;58347:47;58411:131;58537:4;58411:131;:::i;:::-;58403:139;;58130:419;;;:::o;58555:238::-;58695:34;58691:1;58683:6;58679:14;58672:58;58764:21;58759:2;58751:6;58747:15;58740:46;58555:238;:::o;58799:366::-;58941:3;58962:67;59026:2;59021:3;58962:67;:::i;:::-;58955:74;;59038:93;59127:3;59038:93;:::i;:::-;59156:2;59151:3;59147:12;59140:19;;58799:366;;;:::o;59171:419::-;59337:4;59375:2;59364:9;59360:18;59352:26;;59424:9;59418:4;59414:20;59410:1;59399:9;59395:17;59388:47;59452:131;59578:4;59452:131;:::i;:::-;59444:139;;59171:419;;;:::o;59596:225::-;59736:34;59732:1;59724:6;59720:14;59713:58;59805:8;59800:2;59792:6;59788:15;59781:33;59596:225;:::o;59827:366::-;59969:3;59990:67;60054:2;60049:3;59990:67;:::i;:::-;59983:74;;60066:93;60155:3;60066:93;:::i;:::-;60184:2;60179:3;60175:12;60168:19;;59827:366;;;:::o;60199:419::-;60365:4;60403:2;60392:9;60388:18;60380:26;;60452:9;60446:4;60442:20;60438:1;60427:9;60423:17;60416:47;60480:131;60606:4;60480:131;:::i;:::-;60472:139;;60199:419;;;:::o;60624:224::-;60764:34;60760:1;60752:6;60748:14;60741:58;60833:7;60828:2;60820:6;60816:15;60809:32;60624:224;:::o;60854:366::-;60996:3;61017:67;61081:2;61076:3;61017:67;:::i;:::-;61010:74;;61093:93;61182:3;61093:93;:::i;:::-;61211:2;61206:3;61202:12;61195:19;;60854:366;;;:::o;61226:419::-;61392:4;61430:2;61419:9;61415:18;61407:26;;61479:9;61473:4;61469:20;61465:1;61454:9;61450:17;61443:47;61507:131;61633:4;61507:131;:::i;:::-;61499:139;;61226:419;;;:::o;61651:98::-;61702:6;61736:5;61730:12;61720:22;;61651:98;;;:::o;61755:168::-;61838:11;61872:6;61867:3;61860:19;61912:4;61907:3;61903:14;61888:29;;61755:168;;;;:::o;61929:373::-;62015:3;62043:38;62075:5;62043:38;:::i;:::-;62097:70;62160:6;62155:3;62097:70;:::i;:::-;62090:77;;62176:65;62234:6;62229:3;62222:4;62215:5;62211:16;62176:65;:::i;:::-;62266:29;62288:6;62266:29;:::i;:::-;62261:3;62257:39;62250:46;;62019:283;61929:373;;;;:::o;62308:640::-;62503:4;62541:3;62530:9;62526:19;62518:27;;62555:71;62623:1;62612:9;62608:17;62599:6;62555:71;:::i;:::-;62636:72;62704:2;62693:9;62689:18;62680:6;62636:72;:::i;:::-;62718;62786:2;62775:9;62771:18;62762:6;62718:72;:::i;:::-;62837:9;62831:4;62827:20;62822:2;62811:9;62807:18;62800:48;62865:76;62936:4;62927:6;62865:76;:::i;:::-;62857:84;;62308:640;;;;;;;:::o;62954:141::-;63010:5;63041:6;63035:13;63026:22;;63057:32;63083:5;63057:32;:::i;:::-;62954:141;;;;:::o;63101:349::-;63170:6;63219:2;63207:9;63198:7;63194:23;63190:32;63187:119;;;63225:79;;:::i;:::-;63187:119;63345:1;63370:63;63425:7;63416:6;63405:9;63401:22;63370:63;:::i;:::-;63360:73;;63316:127;63101:349;;;;:::o;63456:220::-;63596:34;63592:1;63584:6;63580:14;63573:58;63665:3;63660:2;63652:6;63648:15;63641:28;63456:220;:::o;63682:366::-;63824:3;63845:67;63909:2;63904:3;63845:67;:::i;:::-;63838:74;;63921:93;64010:3;63921:93;:::i;:::-;64039:2;64034:3;64030:12;64023:19;;63682:366;;;:::o;64054:419::-;64220:4;64258:2;64247:9;64243:18;64235:26;;64307:9;64301:4;64297:20;64293:1;64282:9;64278:17;64271:47;64335:131;64461:4;64335:131;:::i;:::-;64327:139;;64054:419;;;:::o;64479:179::-;64619:31;64615:1;64607:6;64603:14;64596:55;64479:179;:::o;64664:366::-;64806:3;64827:67;64891:2;64886:3;64827:67;:::i;:::-;64820:74;;64903:93;64992:3;64903:93;:::i;:::-;65021:2;65016:3;65012:12;65005:19;;64664:366;;;:::o;65036:419::-;65202:4;65240:2;65229:9;65225:18;65217:26;;65289:9;65283:4;65279:20;65275:1;65264:9;65260:17;65253:47;65317:131;65443:4;65317:131;:::i;:::-;65309:139;;65036:419;;;:::o
Swarm Source
ipfs://27b63808d3b579d1446f03352b01c7849ccd69b1cfd77a44024d22d6050d01e5
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.