Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
LondonToken
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.13; import "./Ownable.sol"; import "./ERC1155.sol"; import "./ERC2981PerTokenRoyalties.sol"; import {DefaultOperatorFilterer} from "./DefaultOperatorFilterer.sol"; /// @custom:security-contact [email protected] contract LondonToken is ERC1155, Ownable, ERC2981PerTokenRoyalties, DefaultOperatorFilterer { constructor(string memory uri_, address minter_) ERC1155(uri_) { minter = minter_; } string public constant name = "Verse Works"; uint256 public totalSupply; address public minter; modifier onlyMinter() { require(msg.sender == minter); _; } /** * @dev OS Operator filtering */ function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } /** * @dev OS Operator filtering */ function safeTransferFrom(address from, address to, uint256 tokenId, uint256 amount, bytes memory data) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, amount, data); } /** * @dev OS Operator filtering */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override onlyAllowedOperator(from) { super.safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * In additionit sets the royalties for `royaltyRecipient` of the value `royaltyValue`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function mint( address account, uint256 id, uint256 amount, string memory cid, address royaltyRecipient, uint256 royaltyValue ) public onlyMinter { _mint(account, id, amount, ""); if (royaltyValue > 0) { _setTokenRoyalty(id, royaltyRecipient, royaltyValue); } cids[id] = cid; totalSupply += amount; } /** * @dev Batch version of `mint`. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, string[] memory tokenCids, address[] memory royaltyRecipients, uint256[] memory royaltyValues ) public onlyMinter { require( ids.length == royaltyRecipients.length && ids.length == royaltyValues.length, "ERC1155: Arrays length mismatch" ); _mintBatch(to, ids, amounts, ""); for (uint256 i; i < ids.length; i++) { if (royaltyValues[i] > 0) { _setTokenRoyalty( ids[i], royaltyRecipients[i], royaltyValues[i] ); } // update IPFS CID cids[ids[i]] = tokenCids[i]; } uint256 count; for (uint256 i = 0; i < ids.length; i++) { for (uint256 j = 0; j < amounts.length; j++) { count += ids[i] * amounts[j]; } } totalSupply += count; } /** * @dev Checks for supported interface. * */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC1155, ERC2981Base) returns (bool) { return super.supportsInterface(interfaceId); } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * In additionit sets the royalties for `royaltyRecipient` of the value `royaltyValue`. * Method emits two transfer events. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. */ function mintWithCreator( address creator, address to, uint256 tokenId, string memory cid, address royaltyRecipient, uint256 royaltyValue ) public onlyMinter { require(to != address(0), "mint to the zero address"); balances[tokenId][to] += 1; totalSupply += 1; cids[tokenId] = cid; if (royaltyValue > 0) { _setTokenRoyalty(tokenId, royaltyRecipient, royaltyValue); } address operator = _msgSender(); emit TransferSingle(operator, address(0), creator, tokenId, 1); emit TransferSingle(operator, creator, to, tokenId, 1); } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * In additionit sets the royalties for `royaltyRecipient` of the value `royaltyValue`. * Method emits two transfer events. * * Emits a {TransferSingle} events for intermediate artist. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function batchMintWithCreator( address to, address[] memory creators, uint256[] memory tokenIds, string[] memory tokenCids, address[] memory royaltyRecipients, uint256[] memory royaltyValues ) public onlyMinter { require( tokenIds.length == royaltyRecipients.length && tokenIds.length == royaltyValues.length, "ERC1155: Arrays length mismatch" ); address operator = _msgSender(); for (uint256 i = 0; i < tokenIds.length; i++) { balances[tokenIds[i]][to] += 1; // check if recipient can accept NFT _doSafeTransferAcceptanceCheck( operator, address(0), to, tokenIds[i], 1, "" ); // update royalties if (royaltyValues[i] > 0) { _setTokenRoyalty( tokenIds[i], royaltyRecipients[i], royaltyValues[i] ); } // update IPFS CID cids[tokenIds[i]] = tokenCids[i]; // emit events based on creator provided if (creators[i] == address(0)) { emit TransferSingle(operator, address(0), to, tokenIds[i], 1); } else { emit TransferSingle( operator, address(0), creators[i], tokenIds[i], 1 ); emit TransferSingle(operator, creators[i], to, tokenIds[i], 1); } } // update total supply totalSupply += tokenIds.length; } /** * @dev Sets base URI for metadata. * */ function setURI(string memory newuri) public onlyOwner { _setURI(newuri); } /** * @dev Sets new minter for the contract. * */ function setMinter(address minter_) public onlyOwner { minter = minter_; } /** * @dev Sets royalties for `tokenId` and `tokenRecipient` with royalty value `royaltyValue`. * */ function setRoyalties( uint256 tokenId, address royaltyRecipient, uint256 royaltyValue ) public onlyOwner { _setTokenRoyalty(tokenId, royaltyRecipient, royaltyValue); } /** * @dev Sets IPFS cid metadata hash for token id `tokenId`. * */ function setCID(uint256 tokenId, string memory cid) public onlyOwner { cids[tokenId] = cid; } }
// 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 pragma solidity ^0.8.13; import {OperatorFilterer} from "./OperatorFilterer.sol"; /** * @title DefaultOperatorFilterer * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription. */ abstract contract DefaultOperatorFilterer is OperatorFilterer { address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6); constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/ERC1155.sol) pragma solidity 0.8.13; import "./IERC1155.sol"; import "./IERC1155Receiver.sol"; import "./IERC1155MetadataURI.sol"; import "./Address.sol"; import "./Context.sol"; import "./ERC165.sol"; import "./Strings.sol"; /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) public balances; // Mapping from token ID to the IPFS cid mapping(uint256 => string) public cids; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. string public baseUri; /** * @dev See {_setURI}. */ constructor(string memory uri_) { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256 id) public view virtual override returns (string memory) { return string(abi.encodePacked(baseUri, cids[id])); } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require( account != address(0), "ERC1155: balance query for the zero address" ); return balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require( accounts.length == ids.length, "ERC1155: accounts and ids length mismatch" ); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not owner nor approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: transfer caller is not owner nor approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, to, ids, amounts, data); uint256 fromBalance = balances[id][from]; require( fromBalance >= amount, "ERC1155: insufficient balance for transfer" ); unchecked { balances[id][from] = fromBalance - amount; } balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require( ids.length == amounts.length, "ERC1155: ids and amounts length mismatch" ); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = balances[id][from]; require( fromBalance >= amount, "ERC1155: insufficient balance for transfer" ); unchecked { balances[id][from] = fromBalance - amount; } balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck( operator, from, to, ids, amounts, data ); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { baseUri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeTransferAcceptanceCheck( operator, address(0), to, id, amount, data ); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require( ids.length == amounts.length, "ERC1155: ids and amounts length mismatch" ); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { balances[ids[i]][to] += amounts[i]; emit TransferSingle(operator, address(0), to, ids[i], amounts[i]); } _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck( operator, address(0), to, ids, amounts, data ); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) public { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received( operator, from, id, amount, data ) returns (bytes4 response) { if (response != IERC1155Receiver.onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived( operator, from, ids, amounts, data ) returns (bytes4 response) { if ( response != IERC1155Receiver.onERC1155BatchReceived.selector ) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } }
// 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: MIT pragma solidity 0.8.13; import "./ERC165.sol"; import "./IERC2981Royalties.sol"; /// @dev This is a contract used to add ERC2981 support to ERC721 and 1155 abstract contract ERC2981Base is ERC165, IERC2981Royalties { struct RoyaltyInfo { address recipient; uint24 amount; } /// @inheritdoc ERC165 function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC2981Royalties).interfaceId || super.supportsInterface(interfaceId); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.13; import "./ERC165.sol"; import "./ERC2981Base.sol"; /// @dev This is a contract used to add ERC2981 support to ERC721 and 1155 abstract contract ERC2981PerTokenRoyalties is ERC2981Base { mapping(uint256 => RoyaltyInfo) internal _royalties; /// @dev Sets token royalties /// @param tokenId the token id fir which we register the royalties /// @param recipient recipient of the royalties /// @param value percentage (using 2 decimals - 10000 = 100, 0 = 0) function _setTokenRoyalty( uint256 tokenId, address recipient, uint256 value ) internal { require(value <= 10000, "ERC2981Royalties: Too high"); _royalties[tokenId] = RoyaltyInfo(recipient, uint24(value)); } /// @inheritdoc IERC2981Royalties function royaltyInfo(uint256 tokenId, uint256 value) external view override returns (address receiver, uint256 royaltyAmount) { RoyaltyInfo memory royalties = _royalties[tokenId]; receiver = royalties.recipient; royaltyAmount = (value * royalties.amount) / 10000; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; import "./IERC1155.sol"; /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); }
// 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 pragma solidity 0.8.13; /// @title IERC2981Royalties /// @dev Interface for the ERC2981 - Token Royalty standard interface IERC2981Royalties { /// @notice Called with the sale price to determine how much royalty // is owed and to whom. /// @param _tokenId - the NFT asset queried for royalty information /// @param _value - the sale price of the NFT asset specified by _tokenId /// @return _receiver - address of who should be sent the royalty payment /// @return _royaltyAmount - the royalty payment amount for value sale price function royaltyInfo(uint256 _tokenId, uint256 _value) external view returns (address _receiver, uint256 _royaltyAmount); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; interface IOperatorFilterRegistry { function isOperatorAllowed(address registrant, address operator) external view returns (bool); function register(address registrant) external; function registerAndSubscribe(address registrant, address subscription) external; function registerAndCopyEntries(address registrant, address registrantToCopy) external; function unregister(address addr) external; function updateOperator(address registrant, address operator, bool filtered) external; function updateOperators(address registrant, address[] calldata operators, bool filtered) external; function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; function subscribe(address registrant, address registrantToSubscribe) external; function unsubscribe(address registrant, bool copyExistingEntries) external; function subscriptionOf(address addr) external returns (address registrant); function subscribers(address registrant) external returns (address[] memory); function subscriberAt(address registrant, uint256 index) external returns (address); function copyEntriesOf(address registrant, address registrantToCopy) external; function isOperatorFiltered(address registrant, address operator) external returns (bool); function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); function filteredOperators(address addr) external returns (address[] memory); function filteredCodeHashes(address addr) external returns (bytes32[] memory); function filteredOperatorAt(address registrant, uint256 index) external returns (address); function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); function isRegistered(address addr) external returns (bool); function codeHashOf(address addr) external returns (bytes32); }
// 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 pragma solidity ^0.8.13; import {IOperatorFilterRegistry} from "./IOperatorFilterRegistry.sol"; /** * @title OperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. */ abstract contract OperatorFilterer { error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } modifier onlyAllowedOperator(address from) virtual { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from != msg.sender) { _checkFilterOperator(msg.sender); } _; } modifier onlyAllowedOperatorApproval(address operator) virtual { _checkFilterOperator(operator); _; } function _checkFilterOperator(address operator) internal view virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } } }
// 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) (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":"string","name":"uri_","type":"string"},{"internalType":"address","name":"minter_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"_doSafeTransferAcceptanceCheck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"balances","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":"address","name":"to","type":"address"},{"internalType":"address[]","name":"creators","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"tokenCids","type":"string[]"},{"internalType":"address[]","name":"royaltyRecipients","type":"address[]"},{"internalType":"uint256[]","name":"royaltyValues","type":"uint256[]"}],"name":"batchMintWithCreator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"cids","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"cid","type":"string"},{"internalType":"address","name":"royaltyRecipient","type":"address"},{"internalType":"uint256","name":"royaltyValue","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"string[]","name":"tokenCids","type":"string[]"},{"internalType":"address[]","name":"royaltyRecipients","type":"address[]"},{"internalType":"uint256[]","name":"royaltyValues","type":"uint256[]"}],"name":"mintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"cid","type":"string"},{"internalType":"address","name":"royaltyRecipient","type":"address"},{"internalType":"uint256","name":"royaltyValue","type":"uint256"}],"name":"mintWithCreator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","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":"uint256","name":"amount","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":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"cid","type":"string"}],"name":"setCID","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter_","type":"address"}],"name":"setMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"royaltyRecipient","type":"address"},{"internalType":"uint256","name":"royaltyValue","type":"uint256"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newuri","type":"string"}],"name":"setURI","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":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620055e5380380620055e583398181016040528101906200003791906200065d565b733cc6cdda760b79bafa08df41ecfa224f810dceb66001836200006081620002c160201b60201c565b506200008162000075620002dd60201b60201c565b620002e560201b60201c565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620002765780156200013c576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b815260040162000102929190620006d4565b600060405180830381600087803b1580156200011d57600080fd5b505af115801562000132573d6000803e3d6000fd5b5050505062000275565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620001f6576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620001bc929190620006d4565b600060405180830381600087803b158015620001d757600080fd5b505af1158015620001ec573d6000803e3d6000fd5b5050505062000274565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b81526004016200023f919062000701565b600060405180830381600087803b1580156200025a57600080fd5b505af11580156200026f573d6000803e3d6000fd5b505050505b5b5b505080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505062000782565b8060039080519060200190620002d9929190620003ab565b5050565b600033905090565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620003b9906200074d565b90600052602060002090601f016020900481019282620003dd576000855562000429565b82601f10620003f857805160ff191683800117855562000429565b8280016001018555821562000429579182015b82811115620004285782518255916020019190600101906200040b565b5b5090506200043891906200043c565b5090565b5b80821115620004575760008160009055506001016200043d565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004c48262000479565b810181811067ffffffffffffffff82111715620004e657620004e56200048a565b5b80604052505050565b6000620004fb6200045b565b9050620005098282620004b9565b919050565b600067ffffffffffffffff8211156200052c576200052b6200048a565b5b620005378262000479565b9050602081019050919050565b60005b838110156200056457808201518184015260208101905062000547565b8381111562000574576000848401525b50505050565b6000620005916200058b846200050e565b620004ef565b905082815260208101848484011115620005b057620005af62000474565b5b620005bd84828562000544565b509392505050565b600082601f830112620005dd57620005dc6200046f565b5b8151620005ef8482602086016200057a565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200062582620005f8565b9050919050565b620006378162000618565b81146200064357600080fd5b50565b60008151905062000657816200062c565b92915050565b6000806040838503121562000677576200067662000465565b5b600083015167ffffffffffffffff8111156200069857620006976200046a565b5b620006a685828601620005c5565b9250506020620006b98582860162000646565b9150509250929050565b620006ce8162000618565b82525050565b6000604082019050620006eb6000830185620006c3565b620006fa6020830184620006c3565b9392505050565b6000602082019050620007186000830184620006c3565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200076657607f821691505b6020821081036200077c576200077b6200071e565b5b50919050565b614e5380620007926000396000f3fe608060405234801561001057600080fd5b50600436106101c35760003560e01c8063704fe710116100f9578063a22cb46511610097578063e985e9c511610071578063e985e9c5146104ef578063f242432a1461051f578063f2fde38b1461053b578063fca3b5aa14610557576101c3565b8063a22cb4651461049b578063af877707146104b7578063e2c7f338146104d3576101c3565b80638d2bb093116100d35780638d2bb093146104275780638da5cb5b1461044357806398faf29b146104615780639abc83201461047d576101c3565b8063704fe710146103d1578063715018a61461040157806382295a2d1461040b576101c3565b806318160ddd116101665780632eb2c2d6116101405780632eb2c2d61461034b57806341f43434146103675780634e1273f41461038557806369b52017146103b5576101c3565b806318160ddd146102cc5780631f320331146102ea5780632a55205a1461031a576101c3565b806306fdde03116101a257806306fdde03146102445780630754617214610262578063084e9e24146102805780630e89341c1461029c576101c3565b8062fdd58e146101c857806301ffc9a7146101f857806302fe530514610228575b600080fd5b6101e260048036038101906101dd9190612f1d565b610573565b6040516101ef9190612f6c565b60405180910390f35b610212600480360381019061020d9190612fdf565b61063b565b60405161021f9190613027565b60405180910390f35b610242600480360381019061023d9190613188565b61064d565b005b61024c610661565b6040516102599190613259565b60405180910390f35b61026a61069a565b604051610277919061328a565b60405180910390f35b61029a60048036038101906102959190613346565b6106c0565b005b6102b660048036038101906102b191906133ef565b610897565b6040516102c39190613259565b60405180910390f35b6102d46108d5565b6040516102e19190612f6c565b60405180910390f35b61030460048036038101906102ff919061341c565b6108db565b6040516103119190612f6c565b60405180910390f35b610334600480360381019061032f919061345c565b610900565b60405161034292919061349c565b60405180910390f35b6103656004803603810190610360919061358d565b6109d1565b005b61036f610a24565b60405161037c91906136bb565b60405180910390f35b61039f600480360381019061039a9190613799565b610a36565b6040516103ac91906138cf565b60405180910390f35b6103cf60048036038101906103ca91906139d2565b610b4f565b005b6103eb60048036038101906103e691906133ef565b610dc2565b6040516103f89190613259565b60405180910390f35b610409610e62565b005b61042560048036038101906104209190613aeb565b610e76565b005b610441600480360381019061043c9190613b47565b610eaa565b005b61044b611145565b604051610458919061328a565b60405180910390f35b61047b60048036038101906104769190613bf0565b61116f565b005b610485611242565b6040516104929190613259565b60405180910390f35b6104b560048036038101906104b09190613cc5565b6112d0565b005b6104d160048036038101906104cc9190613d05565b6112e9565b005b6104ed60048036038101906104e89190613e1e565b6117cb565b005b61050960048036038101906105049190613e71565b6117e3565b6040516105169190613027565b60405180910390f35b61053960048036038101906105349190613eb1565b611877565b005b61055560048036038101906105509190613f48565b6118ca565b005b610571600480360381019061056c9190613f48565b61194d565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036105e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105da90613fe7565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600061064682611999565b9050919050565b610655611a13565b61065e81611a91565b50565b6040518060400160405280600b81526020017f566572736520576f726b7300000000000000000000000000000000000000000081525081565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6106df8473ffffffffffffffffffffffffffffffffffffffff16611aab565b1561088f578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b815260040161072595949392919061405c565b6020604051808303816000875af192505050801561076157506040513d601f19601f8201168201806040525081019061075e91906140cb565b60015b6108065761076d614105565b806308c379a0036107c95750610781614127565b8061078c57506107cb565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c09190613259565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107fd90614229565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461088d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610884906142bb565b60405180910390fd5b505b505050505050565b60606003600160008481526020019081526020016000206040516020016108bf9291906143da565b6040516020818303038152906040529050919050565b60065481565b6000602052816000526040600020602052806000526040600020600091509150505481565b6000806000600560008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900462ffffff1662ffffff1662ffffff1681525050905080600001519250612710816020015162ffffff16856109bd919061442d565b6109c791906144b6565b9150509250929050565b843373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a0f57610a0e33611ace565b5b610a1c8686868686611bcb565b505050505050565b6daaeb6d7670e522a718067333cd4e81565b60608151835114610a7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7390614559565b60405180910390fd5b6000835167ffffffffffffffff811115610a9957610a9861305d565b5b604051908082528060200260200182016040528015610ac75781602001602082028036833780820191505090505b50905060005b8451811015610b4457610b14858281518110610aec57610aeb614579565b5b6020026020010151858381518110610b0757610b06614579565b5b6020026020010151610573565b828281518110610b2757610b26614579565b5b60200260200101818152505080610b3d906145a8565b9050610acd565b508091505092915050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ba957600080fd5b81518551148015610bbb575080518551145b610bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf19061463c565b60405180910390fd5b610c1586868660405180602001604052806000815250611c6c565b60005b8551811015610d0d576000828281518110610c3657610c35614579565b5b60200260200101511115610c9e57610c9d868281518110610c5a57610c59614579565b5b6020026020010151848381518110610c7557610c74614579565b5b6020026020010151848481518110610c9057610c8f614579565b5b6020026020010151611ecc565b5b838181518110610cb157610cb0614579565b5b602002602001015160016000888481518110610cd057610ccf614579565b5b602002602001015181526020019081526020016000209080519060200190610cf9929190612dd2565b508080610d05906145a8565b915050610c18565b50600080600090505b8651811015610d9f5760005b8651811015610d8b57868181518110610d3e57610d3d614579565b5b6020026020010151888381518110610d5957610d58614579565b5b6020026020010151610d6b919061442d565b83610d76919061465c565b92508080610d83906145a8565b915050610d22565b508080610d97906145a8565b915050610d16565b508060066000828254610db2919061465c565b9250508190555050505050505050565b60016020528060005260406000206000915090508054610de19061430a565b80601f0160208091040260200160405190810160405280929190818152602001828054610e0d9061430a565b8015610e5a5780601f10610e2f57610100808354040283529160200191610e5a565b820191906000526020600020905b815481529060010190602001808311610e3d57829003601f168201915b505050505081565b610e6a611a13565b610e746000611fc8565b565b610e7e611a13565b80600160008481526020019081526020016000209080519060200190610ea5929190612dd2565b505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f0457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610f73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6a906146fe565b60405180910390fd5b600160008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610fd3919061465c565b92505081905550600160066000828254610fed919061465c565b925050819055508260016000868152602001908152602001600020908051906020019061101b929190612dd2565b50600081111561103157611030848383611ecc565b5b600061103b61208e565b90508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628860016040516110b5929190614759565b60405180910390a48573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62886001604051611134929190614759565b60405180910390a450505050505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111c957600080fd5b6111e486868660405180602001604052806000815250612096565b60008111156111f9576111f8858383611ecc565b5b82600160008781526020019081526020016000209080519060200190611220929190612dd2565b508360066000828254611233919061465c565b92505081905550505050505050565b6003805461124f9061430a565b80601f016020809104026020016040519081016040528092919081815260200182805461127b9061430a565b80156112c85780601f1061129d576101008083540402835291602001916112c8565b820191906000526020600020905b8154815290600101906020018083116112ab57829003601f168201915b505050505081565b816112da81611ace565b6112e48383612246565b505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461134357600080fd5b81518451148015611355575080518451145b611394576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138b9061463c565b60405180910390fd5b600061139e61208e565b905060005b85518110156117a75760016000808884815181106113c4576113c3614579565b5b6020026020010151815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611426919061465c565b925050819055506114668260008a89858151811061144757611446614579565b5b60200260200101516001604051806020016040528060008152506106c0565b600083828151811061147b5761147a614579565b5b602002602001015111156114e3576114e286828151811061149f5761149e614579565b5b60200260200101518583815181106114ba576114b9614579565b5b60200260200101518584815181106114d5576114d4614579565b5b6020026020010151611ecc565b5b8481815181106114f6576114f5614579565b5b60200260200101516001600088848151811061151557611514614579565b5b60200260200101518152602001908152602001600020908051906020019061153e929190612dd2565b50600073ffffffffffffffffffffffffffffffffffffffff1687828151811061156a57611569614579565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff160361162c578773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289858151811061160757611606614579565b5b6020026020010151600160405161161f929190614759565b60405180910390a4611794565b86818151811061163f5761163e614579565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628985815181106116c0576116bf614579565b5b602002602001015160016040516116d8929190614759565b60405180910390a48773ffffffffffffffffffffffffffffffffffffffff1687828151811061170a57611709614579565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289858151811061177357611772614579565b5b6020026020010151600160405161178b929190614759565b60405180910390a45b808061179f906145a8565b9150506113a3565b508451600660008282546117bb919061465c565b9250508190555050505050505050565b6117d3611a13565b6117de838383611ecc565b505050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b843373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146118b5576118b433611ace565b5b6118c2868686868661225c565b505050505050565b6118d2611a13565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611941576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611938906147f4565b60405180910390fd5b61194a81611fc8565b50565b611955611a13565b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611a0c5750611a0b826122fd565b5b9050919050565b611a1b61208e565b73ffffffffffffffffffffffffffffffffffffffff16611a39611145565b73ffffffffffffffffffffffffffffffffffffffff1614611a8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8690614860565b60405180910390fd5b565b8060039080519060200190611aa7929190612dd2565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611bc8576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611b45929190614880565b602060405180830381865afa158015611b62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8691906148be565b611bc757806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611bbe919061328a565b60405180910390fd5b5b50565b611bd361208e565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611c195750611c1885611c1361208e565b6117e3565b5b611c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4f9061495d565b60405180910390fd5b611c6585858585856123df565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611cdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd2906149ef565b60405180910390fd5b8151835114611d1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1690614a81565b60405180910390fd5b6000611d2961208e565b9050611d3a81600087878787612700565b60005b8451811015611ea657838181518110611d5957611d58614579565b5b6020026020010151600080878481518110611d7757611d76614579565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dd9919061465c565b925050819055508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62888581518110611e5a57611e59614579565b5b6020026020010151888681518110611e7557611e74614579565b5b6020026020010151604051611e8b929190614aa1565b60405180910390a48080611e9e906145a8565b915050611d3d565b50611eb681600087878787612708565b611ec581600087878787612710565b5050505050565b612710811115611f11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0890614b16565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff1681526020018262ffffff168152506005600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548162ffffff021916908362ffffff160217905550905050505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fc906149ef565b60405180910390fd5b600061210f61208e565b9050600061211c856128e7565b90506000612129856128e7565b905061213a83600089858589612700565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612199919061465c565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051612217929190614aa1565b60405180910390a461222e83600089858589612708565b61223d836000898989896106c0565b50505050505050565b61225861225161208e565b8383612961565b5050565b61226461208e565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806122aa57506122a9856122a461208e565b6117e3565b5b6122e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e090614ba8565b60405180910390fd5b6122f68585858585612acd565b5050505050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806123c857507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806123d857506123d782612d68565b5b9050919050565b8151835114612423576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241a90614a81565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612492576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248990614c3a565b60405180910390fd5b600061249c61208e565b90506124ac818787878787612700565b60005b845181101561265d5760008582815181106124cd576124cc614579565b5b6020026020010151905060008583815181106124ec576124eb614579565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561258d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258490614ccc565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612642919061465c565b9250508190555050505080612656906145a8565b90506124af565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516126d4929190614cec565b60405180910390a46126ea818787878787612708565b6126f8818787878787612710565b505050505050565b505050505050565b505050505050565b61272f8473ffffffffffffffffffffffffffffffffffffffff16611aab565b156128df578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612775959493929190614d23565b6020604051808303816000875af19250505080156127b157506040513d601f19601f820116820180604052508101906127ae91906140cb565b60015b612856576127bd614105565b806308c379a00361281957506127d1614127565b806127dc575061281b565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128109190613259565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284d90614229565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146128dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d4906142bb565b60405180910390fd5b505b505050505050565b60606000600167ffffffffffffffff8111156129065761290561305d565b5b6040519080825280602002602001820160405280156129345781602001602082028036833780820191505090505b509050828160008151811061294c5761294b614579565b5b60200260200101818152505080915050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036129cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129c690614dfd565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612ac09190613027565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612b3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3390614c3a565b60405180910390fd5b6000612b4661208e565b90506000612b53856128e7565b90506000612b60856128e7565b9050612b70838989858589612700565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015612c07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bfe90614ccc565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cbc919061465c565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a604051612d39929190614aa1565b60405180910390a4612d4f848a8a86868a612708565b612d5d848a8a8a8a8a6106c0565b505050505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b828054612dde9061430a565b90600052602060002090601f016020900481019282612e005760008555612e47565b82601f10612e1957805160ff1916838001178555612e47565b82800160010185558215612e47579182015b82811115612e46578251825591602001919060010190612e2b565b5b509050612e549190612e58565b5090565b5b80821115612e71576000816000905550600101612e59565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612eb482612e89565b9050919050565b612ec481612ea9565b8114612ecf57600080fd5b50565b600081359050612ee181612ebb565b92915050565b6000819050919050565b612efa81612ee7565b8114612f0557600080fd5b50565b600081359050612f1781612ef1565b92915050565b60008060408385031215612f3457612f33612e7f565b5b6000612f4285828601612ed2565b9250506020612f5385828601612f08565b9150509250929050565b612f6681612ee7565b82525050565b6000602082019050612f816000830184612f5d565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612fbc81612f87565b8114612fc757600080fd5b50565b600081359050612fd981612fb3565b92915050565b600060208284031215612ff557612ff4612e7f565b5b600061300384828501612fca565b91505092915050565b60008115159050919050565b6130218161300c565b82525050565b600060208201905061303c6000830184613018565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6130958261304c565b810181811067ffffffffffffffff821117156130b4576130b361305d565b5b80604052505050565b60006130c7612e75565b90506130d3828261308c565b919050565b600067ffffffffffffffff8211156130f3576130f261305d565b5b6130fc8261304c565b9050602081019050919050565b82818337600083830152505050565b600061312b613126846130d8565b6130bd565b90508281526020810184848401111561314757613146613047565b5b613152848285613109565b509392505050565b600082601f83011261316f5761316e613042565b5b813561317f848260208601613118565b91505092915050565b60006020828403121561319e5761319d612e7f565b5b600082013567ffffffffffffffff8111156131bc576131bb612e84565b5b6131c88482850161315a565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561320b5780820151818401526020810190506131f0565b8381111561321a576000848401525b50505050565b600061322b826131d1565b61323581856131dc565b93506132458185602086016131ed565b61324e8161304c565b840191505092915050565b600060208201905081810360008301526132738184613220565b905092915050565b61328481612ea9565b82525050565b600060208201905061329f600083018461327b565b92915050565b600067ffffffffffffffff8211156132c0576132bf61305d565b5b6132c98261304c565b9050602081019050919050565b60006132e96132e4846132a5565b6130bd565b90508281526020810184848401111561330557613304613047565b5b613310848285613109565b509392505050565b600082601f83011261332d5761332c613042565b5b813561333d8482602086016132d6565b91505092915050565b60008060008060008060c0878903121561336357613362612e7f565b5b600061337189828a01612ed2565b965050602061338289828a01612ed2565b955050604061339389828a01612ed2565b94505060606133a489828a01612f08565b93505060806133b589828a01612f08565b92505060a087013567ffffffffffffffff8111156133d6576133d5612e84565b5b6133e289828a01613318565b9150509295509295509295565b60006020828403121561340557613404612e7f565b5b600061341384828501612f08565b91505092915050565b6000806040838503121561343357613432612e7f565b5b600061344185828601612f08565b925050602061345285828601612ed2565b9150509250929050565b6000806040838503121561347357613472612e7f565b5b600061348185828601612f08565b925050602061349285828601612f08565b9150509250929050565b60006040820190506134b1600083018561327b565b6134be6020830184612f5d565b9392505050565b600067ffffffffffffffff8211156134e0576134df61305d565b5b602082029050602081019050919050565b600080fd5b6000613509613504846134c5565b6130bd565b9050808382526020820190506020840283018581111561352c5761352b6134f1565b5b835b8181101561355557806135418882612f08565b84526020840193505060208101905061352e565b5050509392505050565b600082601f83011261357457613573613042565b5b81356135848482602086016134f6565b91505092915050565b600080600080600060a086880312156135a9576135a8612e7f565b5b60006135b788828901612ed2565b95505060206135c888828901612ed2565b945050604086013567ffffffffffffffff8111156135e9576135e8612e84565b5b6135f58882890161355f565b935050606086013567ffffffffffffffff81111561361657613615612e84565b5b6136228882890161355f565b925050608086013567ffffffffffffffff81111561364357613642612e84565b5b61364f88828901613318565b9150509295509295909350565b6000819050919050565b600061368161367c61367784612e89565b61365c565b612e89565b9050919050565b600061369382613666565b9050919050565b60006136a582613688565b9050919050565b6136b58161369a565b82525050565b60006020820190506136d060008301846136ac565b92915050565b600067ffffffffffffffff8211156136f1576136f061305d565b5b602082029050602081019050919050565b6000613715613710846136d6565b6130bd565b90508083825260208201905060208402830185811115613738576137376134f1565b5b835b81811015613761578061374d8882612ed2565b84526020840193505060208101905061373a565b5050509392505050565b600082601f8301126137805761377f613042565b5b8135613790848260208601613702565b91505092915050565b600080604083850312156137b0576137af612e7f565b5b600083013567ffffffffffffffff8111156137ce576137cd612e84565b5b6137da8582860161376b565b925050602083013567ffffffffffffffff8111156137fb576137fa612e84565b5b6138078582860161355f565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61384681612ee7565b82525050565b6000613858838361383d565b60208301905092915050565b6000602082019050919050565b600061387c82613811565b613886818561381c565b93506138918361382d565b8060005b838110156138c25781516138a9888261384c565b97506138b483613864565b925050600181019050613895565b5085935050505092915050565b600060208201905081810360008301526138e98184613871565b905092915050565b600067ffffffffffffffff82111561390c5761390b61305d565b5b602082029050602081019050919050565b600061393061392b846138f1565b6130bd565b90508083825260208201905060208402830185811115613953576139526134f1565b5b835b8181101561399a57803567ffffffffffffffff81111561397857613977613042565b5b808601613985898261315a565b85526020850194505050602081019050613955565b5050509392505050565b600082601f8301126139b9576139b8613042565b5b81356139c984826020860161391d565b91505092915050565b60008060008060008060c087890312156139ef576139ee612e7f565b5b60006139fd89828a01612ed2565b965050602087013567ffffffffffffffff811115613a1e57613a1d612e84565b5b613a2a89828a0161355f565b955050604087013567ffffffffffffffff811115613a4b57613a4a612e84565b5b613a5789828a0161355f565b945050606087013567ffffffffffffffff811115613a7857613a77612e84565b5b613a8489828a016139a4565b935050608087013567ffffffffffffffff811115613aa557613aa4612e84565b5b613ab189828a0161376b565b92505060a087013567ffffffffffffffff811115613ad257613ad1612e84565b5b613ade89828a0161355f565b9150509295509295509295565b60008060408385031215613b0257613b01612e7f565b5b6000613b1085828601612f08565b925050602083013567ffffffffffffffff811115613b3157613b30612e84565b5b613b3d8582860161315a565b9150509250929050565b60008060008060008060c08789031215613b6457613b63612e7f565b5b6000613b7289828a01612ed2565b9650506020613b8389828a01612ed2565b9550506040613b9489828a01612f08565b945050606087013567ffffffffffffffff811115613bb557613bb4612e84565b5b613bc189828a0161315a565b9350506080613bd289828a01612ed2565b92505060a0613be389828a01612f08565b9150509295509295509295565b60008060008060008060c08789031215613c0d57613c0c612e7f565b5b6000613c1b89828a01612ed2565b9650506020613c2c89828a01612f08565b9550506040613c3d89828a01612f08565b945050606087013567ffffffffffffffff811115613c5e57613c5d612e84565b5b613c6a89828a0161315a565b9350506080613c7b89828a01612ed2565b92505060a0613c8c89828a01612f08565b9150509295509295509295565b613ca28161300c565b8114613cad57600080fd5b50565b600081359050613cbf81613c99565b92915050565b60008060408385031215613cdc57613cdb612e7f565b5b6000613cea85828601612ed2565b9250506020613cfb85828601613cb0565b9150509250929050565b60008060008060008060c08789031215613d2257613d21612e7f565b5b6000613d3089828a01612ed2565b965050602087013567ffffffffffffffff811115613d5157613d50612e84565b5b613d5d89828a0161376b565b955050604087013567ffffffffffffffff811115613d7e57613d7d612e84565b5b613d8a89828a0161355f565b945050606087013567ffffffffffffffff811115613dab57613daa612e84565b5b613db789828a016139a4565b935050608087013567ffffffffffffffff811115613dd857613dd7612e84565b5b613de489828a0161376b565b92505060a087013567ffffffffffffffff811115613e0557613e04612e84565b5b613e1189828a0161355f565b9150509295509295509295565b600080600060608486031215613e3757613e36612e7f565b5b6000613e4586828701612f08565b9350506020613e5686828701612ed2565b9250506040613e6786828701612f08565b9150509250925092565b60008060408385031215613e8857613e87612e7f565b5b6000613e9685828601612ed2565b9250506020613ea785828601612ed2565b9150509250929050565b600080600080600060a08688031215613ecd57613ecc612e7f565b5b6000613edb88828901612ed2565b9550506020613eec88828901612ed2565b9450506040613efd88828901612f08565b9350506060613f0e88828901612f08565b925050608086013567ffffffffffffffff811115613f2f57613f2e612e84565b5b613f3b88828901613318565b9150509295509295909350565b600060208284031215613f5e57613f5d612e7f565b5b6000613f6c84828501612ed2565b91505092915050565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000613fd1602b836131dc565b9150613fdc82613f75565b604082019050919050565b6000602082019050818103600083015261400081613fc4565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061402e82614007565b6140388185614012565b93506140488185602086016131ed565b6140518161304c565b840191505092915050565b600060a082019050614071600083018861327b565b61407e602083018761327b565b61408b6040830186612f5d565b6140986060830185612f5d565b81810360808301526140aa8184614023565b90509695505050505050565b6000815190506140c581612fb3565b92915050565b6000602082840312156140e1576140e0612e7f565b5b60006140ef848285016140b6565b91505092915050565b60008160e01c9050919050565b600060033d11156141245760046000803e6141216000516140f8565b90505b90565b600060443d106141b457614139612e75565b60043d036004823e80513d602482011167ffffffffffffffff821117156141615750506141b4565b808201805167ffffffffffffffff81111561417f57505050506141b4565b80602083010160043d03850181111561419c5750505050506141b4565b6141ab8260200185018661308c565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b60006142136034836131dc565b915061421e826141b7565b604082019050919050565b6000602082019050818103600083015261424281614206565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b60006142a56028836131dc565b91506142b082614249565b604082019050919050565b600060208201905081810360008301526142d481614298565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061432257607f821691505b602082108103614335576143346142db565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546143688161430a565b614372818661433b565b9450600182166000811461438d576001811461439e576143d1565b60ff198316865281860193506143d1565b6143a785614346565b60005b838110156143c9578154818901526001820191506020810190506143aa565b838801955050505b50505092915050565b60006143e6828561435b565b91506143f2828461435b565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061443882612ee7565b915061444383612ee7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561447c5761447b6143fe565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006144c182612ee7565b91506144cc83612ee7565b9250826144dc576144db614487565b5b828204905092915050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b60006145436029836131dc565b915061454e826144e7565b604082019050919050565b6000602082019050818103600083015261457281614536565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006145b382612ee7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036145e5576145e46143fe565b5b600182019050919050565b7f455243313135353a20417272617973206c656e677468206d69736d6174636800600082015250565b6000614626601f836131dc565b9150614631826145f0565b602082019050919050565b6000602082019050818103600083015261465581614619565b9050919050565b600061466782612ee7565b915061467283612ee7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156146a7576146a66143fe565b5b828201905092915050565b7f6d696e7420746f20746865207a65726f20616464726573730000000000000000600082015250565b60006146e86018836131dc565b91506146f3826146b2565b602082019050919050565b60006020820190508181036000830152614717816146db565b9050919050565b6000819050919050565b600061474361473e6147398461471e565b61365c565b612ee7565b9050919050565b61475381614728565b82525050565b600060408201905061476e6000830185612f5d565b61477b602083018461474a565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006147de6026836131dc565b91506147e982614782565b604082019050919050565b6000602082019050818103600083015261480d816147d1565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061484a6020836131dc565b915061485582614814565b602082019050919050565b600060208201905081810360008301526148798161483d565b9050919050565b6000604082019050614895600083018561327b565b6148a2602083018461327b565b9392505050565b6000815190506148b881613c99565b92915050565b6000602082840312156148d4576148d3612e7f565b5b60006148e2848285016148a9565b91505092915050565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b60006149476032836131dc565b9150614952826148eb565b604082019050919050565b600060208201905081810360008301526149768161493a565b9050919050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006149d96021836131dc565b91506149e48261497d565b604082019050919050565b60006020820190508181036000830152614a08816149cc565b9050919050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000614a6b6028836131dc565b9150614a7682614a0f565b604082019050919050565b60006020820190508181036000830152614a9a81614a5e565b9050919050565b6000604082019050614ab66000830185612f5d565b614ac36020830184612f5d565b9392505050565b7f45524332393831526f79616c746965733a20546f6f2068696768000000000000600082015250565b6000614b00601a836131dc565b9150614b0b82614aca565b602082019050919050565b60006020820190508181036000830152614b2f81614af3565b9050919050565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b6000614b926029836131dc565b9150614b9d82614b36565b604082019050919050565b60006020820190508181036000830152614bc181614b85565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614c246025836131dc565b9150614c2f82614bc8565b604082019050919050565b60006020820190508181036000830152614c5381614c17565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000614cb6602a836131dc565b9150614cc182614c5a565b604082019050919050565b60006020820190508181036000830152614ce581614ca9565b9050919050565b60006040820190508181036000830152614d068185613871565b90508181036020830152614d1a8184613871565b90509392505050565b600060a082019050614d38600083018861327b565b614d45602083018761327b565b8181036040830152614d578186613871565b90508181036060830152614d6b8185613871565b90508181036080830152614d7f8184614023565b90509695505050505050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b6000614de76029836131dc565b9150614df282614d8b565b604082019050919050565b60006020820190508181036000830152614e1681614dda565b905091905056fea264697066735822122017547a6a2e11df43332e1e3da50153982c6e502f205cbb86ceb8c5808a60c50064736f6c634300080d00330000000000000000000000000000000000000000000000000000000000000040000000000000000000000000e445fb0297f7d1f507df708185946210eb6a9de6000000000000000000000000000000000000000000000000000000000000002268747470733a2f2f3070726f642e696e667572612d697066732e696f2f697066732f000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101c35760003560e01c8063704fe710116100f9578063a22cb46511610097578063e985e9c511610071578063e985e9c5146104ef578063f242432a1461051f578063f2fde38b1461053b578063fca3b5aa14610557576101c3565b8063a22cb4651461049b578063af877707146104b7578063e2c7f338146104d3576101c3565b80638d2bb093116100d35780638d2bb093146104275780638da5cb5b1461044357806398faf29b146104615780639abc83201461047d576101c3565b8063704fe710146103d1578063715018a61461040157806382295a2d1461040b576101c3565b806318160ddd116101665780632eb2c2d6116101405780632eb2c2d61461034b57806341f43434146103675780634e1273f41461038557806369b52017146103b5576101c3565b806318160ddd146102cc5780631f320331146102ea5780632a55205a1461031a576101c3565b806306fdde03116101a257806306fdde03146102445780630754617214610262578063084e9e24146102805780630e89341c1461029c576101c3565b8062fdd58e146101c857806301ffc9a7146101f857806302fe530514610228575b600080fd5b6101e260048036038101906101dd9190612f1d565b610573565b6040516101ef9190612f6c565b60405180910390f35b610212600480360381019061020d9190612fdf565b61063b565b60405161021f9190613027565b60405180910390f35b610242600480360381019061023d9190613188565b61064d565b005b61024c610661565b6040516102599190613259565b60405180910390f35b61026a61069a565b604051610277919061328a565b60405180910390f35b61029a60048036038101906102959190613346565b6106c0565b005b6102b660048036038101906102b191906133ef565b610897565b6040516102c39190613259565b60405180910390f35b6102d46108d5565b6040516102e19190612f6c565b60405180910390f35b61030460048036038101906102ff919061341c565b6108db565b6040516103119190612f6c565b60405180910390f35b610334600480360381019061032f919061345c565b610900565b60405161034292919061349c565b60405180910390f35b6103656004803603810190610360919061358d565b6109d1565b005b61036f610a24565b60405161037c91906136bb565b60405180910390f35b61039f600480360381019061039a9190613799565b610a36565b6040516103ac91906138cf565b60405180910390f35b6103cf60048036038101906103ca91906139d2565b610b4f565b005b6103eb60048036038101906103e691906133ef565b610dc2565b6040516103f89190613259565b60405180910390f35b610409610e62565b005b61042560048036038101906104209190613aeb565b610e76565b005b610441600480360381019061043c9190613b47565b610eaa565b005b61044b611145565b604051610458919061328a565b60405180910390f35b61047b60048036038101906104769190613bf0565b61116f565b005b610485611242565b6040516104929190613259565b60405180910390f35b6104b560048036038101906104b09190613cc5565b6112d0565b005b6104d160048036038101906104cc9190613d05565b6112e9565b005b6104ed60048036038101906104e89190613e1e565b6117cb565b005b61050960048036038101906105049190613e71565b6117e3565b6040516105169190613027565b60405180910390f35b61053960048036038101906105349190613eb1565b611877565b005b61055560048036038101906105509190613f48565b6118ca565b005b610571600480360381019061056c9190613f48565b61194d565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036105e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105da90613fe7565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600061064682611999565b9050919050565b610655611a13565b61065e81611a91565b50565b6040518060400160405280600b81526020017f566572736520576f726b7300000000000000000000000000000000000000000081525081565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6106df8473ffffffffffffffffffffffffffffffffffffffff16611aab565b1561088f578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b815260040161072595949392919061405c565b6020604051808303816000875af192505050801561076157506040513d601f19601f8201168201806040525081019061075e91906140cb565b60015b6108065761076d614105565b806308c379a0036107c95750610781614127565b8061078c57506107cb565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c09190613259565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107fd90614229565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461088d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610884906142bb565b60405180910390fd5b505b505050505050565b60606003600160008481526020019081526020016000206040516020016108bf9291906143da565b6040516020818303038152906040529050919050565b60065481565b6000602052816000526040600020602052806000526040600020600091509150505481565b6000806000600560008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900462ffffff1662ffffff1662ffffff1681525050905080600001519250612710816020015162ffffff16856109bd919061442d565b6109c791906144b6565b9150509250929050565b843373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a0f57610a0e33611ace565b5b610a1c8686868686611bcb565b505050505050565b6daaeb6d7670e522a718067333cd4e81565b60608151835114610a7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7390614559565b60405180910390fd5b6000835167ffffffffffffffff811115610a9957610a9861305d565b5b604051908082528060200260200182016040528015610ac75781602001602082028036833780820191505090505b50905060005b8451811015610b4457610b14858281518110610aec57610aeb614579565b5b6020026020010151858381518110610b0757610b06614579565b5b6020026020010151610573565b828281518110610b2757610b26614579565b5b60200260200101818152505080610b3d906145a8565b9050610acd565b508091505092915050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ba957600080fd5b81518551148015610bbb575080518551145b610bfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf19061463c565b60405180910390fd5b610c1586868660405180602001604052806000815250611c6c565b60005b8551811015610d0d576000828281518110610c3657610c35614579565b5b60200260200101511115610c9e57610c9d868281518110610c5a57610c59614579565b5b6020026020010151848381518110610c7557610c74614579565b5b6020026020010151848481518110610c9057610c8f614579565b5b6020026020010151611ecc565b5b838181518110610cb157610cb0614579565b5b602002602001015160016000888481518110610cd057610ccf614579565b5b602002602001015181526020019081526020016000209080519060200190610cf9929190612dd2565b508080610d05906145a8565b915050610c18565b50600080600090505b8651811015610d9f5760005b8651811015610d8b57868181518110610d3e57610d3d614579565b5b6020026020010151888381518110610d5957610d58614579565b5b6020026020010151610d6b919061442d565b83610d76919061465c565b92508080610d83906145a8565b915050610d22565b508080610d97906145a8565b915050610d16565b508060066000828254610db2919061465c565b9250508190555050505050505050565b60016020528060005260406000206000915090508054610de19061430a565b80601f0160208091040260200160405190810160405280929190818152602001828054610e0d9061430a565b8015610e5a5780601f10610e2f57610100808354040283529160200191610e5a565b820191906000526020600020905b815481529060010190602001808311610e3d57829003601f168201915b505050505081565b610e6a611a13565b610e746000611fc8565b565b610e7e611a13565b80600160008481526020019081526020016000209080519060200190610ea5929190612dd2565b505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f0457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610f73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6a906146fe565b60405180910390fd5b600160008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610fd3919061465c565b92505081905550600160066000828254610fed919061465c565b925050819055508260016000868152602001908152602001600020908051906020019061101b929190612dd2565b50600081111561103157611030848383611ecc565b5b600061103b61208e565b90508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628860016040516110b5929190614759565b60405180910390a48573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62886001604051611134929190614759565b60405180910390a450505050505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111c957600080fd5b6111e486868660405180602001604052806000815250612096565b60008111156111f9576111f8858383611ecc565b5b82600160008781526020019081526020016000209080519060200190611220929190612dd2565b508360066000828254611233919061465c565b92505081905550505050505050565b6003805461124f9061430a565b80601f016020809104026020016040519081016040528092919081815260200182805461127b9061430a565b80156112c85780601f1061129d576101008083540402835291602001916112c8565b820191906000526020600020905b8154815290600101906020018083116112ab57829003601f168201915b505050505081565b816112da81611ace565b6112e48383612246565b505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461134357600080fd5b81518451148015611355575080518451145b611394576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138b9061463c565b60405180910390fd5b600061139e61208e565b905060005b85518110156117a75760016000808884815181106113c4576113c3614579565b5b6020026020010151815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611426919061465c565b925050819055506114668260008a89858151811061144757611446614579565b5b60200260200101516001604051806020016040528060008152506106c0565b600083828151811061147b5761147a614579565b5b602002602001015111156114e3576114e286828151811061149f5761149e614579565b5b60200260200101518583815181106114ba576114b9614579565b5b60200260200101518584815181106114d5576114d4614579565b5b6020026020010151611ecc565b5b8481815181106114f6576114f5614579565b5b60200260200101516001600088848151811061151557611514614579565b5b60200260200101518152602001908152602001600020908051906020019061153e929190612dd2565b50600073ffffffffffffffffffffffffffffffffffffffff1687828151811061156a57611569614579565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff160361162c578773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289858151811061160757611606614579565b5b6020026020010151600160405161161f929190614759565b60405180910390a4611794565b86818151811061163f5761163e614579565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628985815181106116c0576116bf614579565b5b602002602001015160016040516116d8929190614759565b60405180910390a48773ffffffffffffffffffffffffffffffffffffffff1687828151811061170a57611709614579565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289858151811061177357611772614579565b5b6020026020010151600160405161178b929190614759565b60405180910390a45b808061179f906145a8565b9150506113a3565b508451600660008282546117bb919061465c565b9250508190555050505050505050565b6117d3611a13565b6117de838383611ecc565b505050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b843373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146118b5576118b433611ace565b5b6118c2868686868661225c565b505050505050565b6118d2611a13565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611941576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611938906147f4565b60405180910390fd5b61194a81611fc8565b50565b611955611a13565b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611a0c5750611a0b826122fd565b5b9050919050565b611a1b61208e565b73ffffffffffffffffffffffffffffffffffffffff16611a39611145565b73ffffffffffffffffffffffffffffffffffffffff1614611a8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8690614860565b60405180910390fd5b565b8060039080519060200190611aa7929190612dd2565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611bc8576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611b45929190614880565b602060405180830381865afa158015611b62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8691906148be565b611bc757806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611bbe919061328a565b60405180910390fd5b5b50565b611bd361208e565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611c195750611c1885611c1361208e565b6117e3565b5b611c58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4f9061495d565b60405180910390fd5b611c6585858585856123df565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611cdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd2906149ef565b60405180910390fd5b8151835114611d1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1690614a81565b60405180910390fd5b6000611d2961208e565b9050611d3a81600087878787612700565b60005b8451811015611ea657838181518110611d5957611d58614579565b5b6020026020010151600080878481518110611d7757611d76614579565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dd9919061465c565b925050819055508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62888581518110611e5a57611e59614579565b5b6020026020010151888681518110611e7557611e74614579565b5b6020026020010151604051611e8b929190614aa1565b60405180910390a48080611e9e906145a8565b915050611d3d565b50611eb681600087878787612708565b611ec581600087878787612710565b5050505050565b612710811115611f11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0890614b16565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff1681526020018262ffffff168152506005600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548162ffffff021916908362ffffff160217905550905050505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fc906149ef565b60405180910390fd5b600061210f61208e565b9050600061211c856128e7565b90506000612129856128e7565b905061213a83600089858589612700565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612199919061465c565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051612217929190614aa1565b60405180910390a461222e83600089858589612708565b61223d836000898989896106c0565b50505050505050565b61225861225161208e565b8383612961565b5050565b61226461208e565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806122aa57506122a9856122a461208e565b6117e3565b5b6122e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e090614ba8565b60405180910390fd5b6122f68585858585612acd565b5050505050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806123c857507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806123d857506123d782612d68565b5b9050919050565b8151835114612423576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241a90614a81565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612492576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248990614c3a565b60405180910390fd5b600061249c61208e565b90506124ac818787878787612700565b60005b845181101561265d5760008582815181106124cd576124cc614579565b5b6020026020010151905060008583815181106124ec576124eb614579565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561258d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258490614ccc565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612642919061465c565b9250508190555050505080612656906145a8565b90506124af565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516126d4929190614cec565b60405180910390a46126ea818787878787612708565b6126f8818787878787612710565b505050505050565b505050505050565b505050505050565b61272f8473ffffffffffffffffffffffffffffffffffffffff16611aab565b156128df578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612775959493929190614d23565b6020604051808303816000875af19250505080156127b157506040513d601f19601f820116820180604052508101906127ae91906140cb565b60015b612856576127bd614105565b806308c379a00361281957506127d1614127565b806127dc575061281b565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128109190613259565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284d90614229565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146128dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d4906142bb565b60405180910390fd5b505b505050505050565b60606000600167ffffffffffffffff8111156129065761290561305d565b5b6040519080825280602002602001820160405280156129345781602001602082028036833780820191505090505b509050828160008151811061294c5761294b614579565b5b60200260200101818152505080915050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036129cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129c690614dfd565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612ac09190613027565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612b3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3390614c3a565b60405180910390fd5b6000612b4661208e565b90506000612b53856128e7565b90506000612b60856128e7565b9050612b70838989858589612700565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015612c07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bfe90614ccc565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612cbc919061465c565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a604051612d39929190614aa1565b60405180910390a4612d4f848a8a86868a612708565b612d5d848a8a8a8a8a6106c0565b505050505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b828054612dde9061430a565b90600052602060002090601f016020900481019282612e005760008555612e47565b82601f10612e1957805160ff1916838001178555612e47565b82800160010185558215612e47579182015b82811115612e46578251825591602001919060010190612e2b565b5b509050612e549190612e58565b5090565b5b80821115612e71576000816000905550600101612e59565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612eb482612e89565b9050919050565b612ec481612ea9565b8114612ecf57600080fd5b50565b600081359050612ee181612ebb565b92915050565b6000819050919050565b612efa81612ee7565b8114612f0557600080fd5b50565b600081359050612f1781612ef1565b92915050565b60008060408385031215612f3457612f33612e7f565b5b6000612f4285828601612ed2565b9250506020612f5385828601612f08565b9150509250929050565b612f6681612ee7565b82525050565b6000602082019050612f816000830184612f5d565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612fbc81612f87565b8114612fc757600080fd5b50565b600081359050612fd981612fb3565b92915050565b600060208284031215612ff557612ff4612e7f565b5b600061300384828501612fca565b91505092915050565b60008115159050919050565b6130218161300c565b82525050565b600060208201905061303c6000830184613018565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6130958261304c565b810181811067ffffffffffffffff821117156130b4576130b361305d565b5b80604052505050565b60006130c7612e75565b90506130d3828261308c565b919050565b600067ffffffffffffffff8211156130f3576130f261305d565b5b6130fc8261304c565b9050602081019050919050565b82818337600083830152505050565b600061312b613126846130d8565b6130bd565b90508281526020810184848401111561314757613146613047565b5b613152848285613109565b509392505050565b600082601f83011261316f5761316e613042565b5b813561317f848260208601613118565b91505092915050565b60006020828403121561319e5761319d612e7f565b5b600082013567ffffffffffffffff8111156131bc576131bb612e84565b5b6131c88482850161315a565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561320b5780820151818401526020810190506131f0565b8381111561321a576000848401525b50505050565b600061322b826131d1565b61323581856131dc565b93506132458185602086016131ed565b61324e8161304c565b840191505092915050565b600060208201905081810360008301526132738184613220565b905092915050565b61328481612ea9565b82525050565b600060208201905061329f600083018461327b565b92915050565b600067ffffffffffffffff8211156132c0576132bf61305d565b5b6132c98261304c565b9050602081019050919050565b60006132e96132e4846132a5565b6130bd565b90508281526020810184848401111561330557613304613047565b5b613310848285613109565b509392505050565b600082601f83011261332d5761332c613042565b5b813561333d8482602086016132d6565b91505092915050565b60008060008060008060c0878903121561336357613362612e7f565b5b600061337189828a01612ed2565b965050602061338289828a01612ed2565b955050604061339389828a01612ed2565b94505060606133a489828a01612f08565b93505060806133b589828a01612f08565b92505060a087013567ffffffffffffffff8111156133d6576133d5612e84565b5b6133e289828a01613318565b9150509295509295509295565b60006020828403121561340557613404612e7f565b5b600061341384828501612f08565b91505092915050565b6000806040838503121561343357613432612e7f565b5b600061344185828601612f08565b925050602061345285828601612ed2565b9150509250929050565b6000806040838503121561347357613472612e7f565b5b600061348185828601612f08565b925050602061349285828601612f08565b9150509250929050565b60006040820190506134b1600083018561327b565b6134be6020830184612f5d565b9392505050565b600067ffffffffffffffff8211156134e0576134df61305d565b5b602082029050602081019050919050565b600080fd5b6000613509613504846134c5565b6130bd565b9050808382526020820190506020840283018581111561352c5761352b6134f1565b5b835b8181101561355557806135418882612f08565b84526020840193505060208101905061352e565b5050509392505050565b600082601f83011261357457613573613042565b5b81356135848482602086016134f6565b91505092915050565b600080600080600060a086880312156135a9576135a8612e7f565b5b60006135b788828901612ed2565b95505060206135c888828901612ed2565b945050604086013567ffffffffffffffff8111156135e9576135e8612e84565b5b6135f58882890161355f565b935050606086013567ffffffffffffffff81111561361657613615612e84565b5b6136228882890161355f565b925050608086013567ffffffffffffffff81111561364357613642612e84565b5b61364f88828901613318565b9150509295509295909350565b6000819050919050565b600061368161367c61367784612e89565b61365c565b612e89565b9050919050565b600061369382613666565b9050919050565b60006136a582613688565b9050919050565b6136b58161369a565b82525050565b60006020820190506136d060008301846136ac565b92915050565b600067ffffffffffffffff8211156136f1576136f061305d565b5b602082029050602081019050919050565b6000613715613710846136d6565b6130bd565b90508083825260208201905060208402830185811115613738576137376134f1565b5b835b81811015613761578061374d8882612ed2565b84526020840193505060208101905061373a565b5050509392505050565b600082601f8301126137805761377f613042565b5b8135613790848260208601613702565b91505092915050565b600080604083850312156137b0576137af612e7f565b5b600083013567ffffffffffffffff8111156137ce576137cd612e84565b5b6137da8582860161376b565b925050602083013567ffffffffffffffff8111156137fb576137fa612e84565b5b6138078582860161355f565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61384681612ee7565b82525050565b6000613858838361383d565b60208301905092915050565b6000602082019050919050565b600061387c82613811565b613886818561381c565b93506138918361382d565b8060005b838110156138c25781516138a9888261384c565b97506138b483613864565b925050600181019050613895565b5085935050505092915050565b600060208201905081810360008301526138e98184613871565b905092915050565b600067ffffffffffffffff82111561390c5761390b61305d565b5b602082029050602081019050919050565b600061393061392b846138f1565b6130bd565b90508083825260208201905060208402830185811115613953576139526134f1565b5b835b8181101561399a57803567ffffffffffffffff81111561397857613977613042565b5b808601613985898261315a565b85526020850194505050602081019050613955565b5050509392505050565b600082601f8301126139b9576139b8613042565b5b81356139c984826020860161391d565b91505092915050565b60008060008060008060c087890312156139ef576139ee612e7f565b5b60006139fd89828a01612ed2565b965050602087013567ffffffffffffffff811115613a1e57613a1d612e84565b5b613a2a89828a0161355f565b955050604087013567ffffffffffffffff811115613a4b57613a4a612e84565b5b613a5789828a0161355f565b945050606087013567ffffffffffffffff811115613a7857613a77612e84565b5b613a8489828a016139a4565b935050608087013567ffffffffffffffff811115613aa557613aa4612e84565b5b613ab189828a0161376b565b92505060a087013567ffffffffffffffff811115613ad257613ad1612e84565b5b613ade89828a0161355f565b9150509295509295509295565b60008060408385031215613b0257613b01612e7f565b5b6000613b1085828601612f08565b925050602083013567ffffffffffffffff811115613b3157613b30612e84565b5b613b3d8582860161315a565b9150509250929050565b60008060008060008060c08789031215613b6457613b63612e7f565b5b6000613b7289828a01612ed2565b9650506020613b8389828a01612ed2565b9550506040613b9489828a01612f08565b945050606087013567ffffffffffffffff811115613bb557613bb4612e84565b5b613bc189828a0161315a565b9350506080613bd289828a01612ed2565b92505060a0613be389828a01612f08565b9150509295509295509295565b60008060008060008060c08789031215613c0d57613c0c612e7f565b5b6000613c1b89828a01612ed2565b9650506020613c2c89828a01612f08565b9550506040613c3d89828a01612f08565b945050606087013567ffffffffffffffff811115613c5e57613c5d612e84565b5b613c6a89828a0161315a565b9350506080613c7b89828a01612ed2565b92505060a0613c8c89828a01612f08565b9150509295509295509295565b613ca28161300c565b8114613cad57600080fd5b50565b600081359050613cbf81613c99565b92915050565b60008060408385031215613cdc57613cdb612e7f565b5b6000613cea85828601612ed2565b9250506020613cfb85828601613cb0565b9150509250929050565b60008060008060008060c08789031215613d2257613d21612e7f565b5b6000613d3089828a01612ed2565b965050602087013567ffffffffffffffff811115613d5157613d50612e84565b5b613d5d89828a0161376b565b955050604087013567ffffffffffffffff811115613d7e57613d7d612e84565b5b613d8a89828a0161355f565b945050606087013567ffffffffffffffff811115613dab57613daa612e84565b5b613db789828a016139a4565b935050608087013567ffffffffffffffff811115613dd857613dd7612e84565b5b613de489828a0161376b565b92505060a087013567ffffffffffffffff811115613e0557613e04612e84565b5b613e1189828a0161355f565b9150509295509295509295565b600080600060608486031215613e3757613e36612e7f565b5b6000613e4586828701612f08565b9350506020613e5686828701612ed2565b9250506040613e6786828701612f08565b9150509250925092565b60008060408385031215613e8857613e87612e7f565b5b6000613e9685828601612ed2565b9250506020613ea785828601612ed2565b9150509250929050565b600080600080600060a08688031215613ecd57613ecc612e7f565b5b6000613edb88828901612ed2565b9550506020613eec88828901612ed2565b9450506040613efd88828901612f08565b9350506060613f0e88828901612f08565b925050608086013567ffffffffffffffff811115613f2f57613f2e612e84565b5b613f3b88828901613318565b9150509295509295909350565b600060208284031215613f5e57613f5d612e7f565b5b6000613f6c84828501612ed2565b91505092915050565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000613fd1602b836131dc565b9150613fdc82613f75565b604082019050919050565b6000602082019050818103600083015261400081613fc4565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061402e82614007565b6140388185614012565b93506140488185602086016131ed565b6140518161304c565b840191505092915050565b600060a082019050614071600083018861327b565b61407e602083018761327b565b61408b6040830186612f5d565b6140986060830185612f5d565b81810360808301526140aa8184614023565b90509695505050505050565b6000815190506140c581612fb3565b92915050565b6000602082840312156140e1576140e0612e7f565b5b60006140ef848285016140b6565b91505092915050565b60008160e01c9050919050565b600060033d11156141245760046000803e6141216000516140f8565b90505b90565b600060443d106141b457614139612e75565b60043d036004823e80513d602482011167ffffffffffffffff821117156141615750506141b4565b808201805167ffffffffffffffff81111561417f57505050506141b4565b80602083010160043d03850181111561419c5750505050506141b4565b6141ab8260200185018661308c565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b60006142136034836131dc565b915061421e826141b7565b604082019050919050565b6000602082019050818103600083015261424281614206565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b60006142a56028836131dc565b91506142b082614249565b604082019050919050565b600060208201905081810360008301526142d481614298565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061432257607f821691505b602082108103614335576143346142db565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546143688161430a565b614372818661433b565b9450600182166000811461438d576001811461439e576143d1565b60ff198316865281860193506143d1565b6143a785614346565b60005b838110156143c9578154818901526001820191506020810190506143aa565b838801955050505b50505092915050565b60006143e6828561435b565b91506143f2828461435b565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061443882612ee7565b915061444383612ee7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561447c5761447b6143fe565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006144c182612ee7565b91506144cc83612ee7565b9250826144dc576144db614487565b5b828204905092915050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b60006145436029836131dc565b915061454e826144e7565b604082019050919050565b6000602082019050818103600083015261457281614536565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006145b382612ee7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036145e5576145e46143fe565b5b600182019050919050565b7f455243313135353a20417272617973206c656e677468206d69736d6174636800600082015250565b6000614626601f836131dc565b9150614631826145f0565b602082019050919050565b6000602082019050818103600083015261465581614619565b9050919050565b600061466782612ee7565b915061467283612ee7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156146a7576146a66143fe565b5b828201905092915050565b7f6d696e7420746f20746865207a65726f20616464726573730000000000000000600082015250565b60006146e86018836131dc565b91506146f3826146b2565b602082019050919050565b60006020820190508181036000830152614717816146db565b9050919050565b6000819050919050565b600061474361473e6147398461471e565b61365c565b612ee7565b9050919050565b61475381614728565b82525050565b600060408201905061476e6000830185612f5d565b61477b602083018461474a565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006147de6026836131dc565b91506147e982614782565b604082019050919050565b6000602082019050818103600083015261480d816147d1565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061484a6020836131dc565b915061485582614814565b602082019050919050565b600060208201905081810360008301526148798161483d565b9050919050565b6000604082019050614895600083018561327b565b6148a2602083018461327b565b9392505050565b6000815190506148b881613c99565b92915050565b6000602082840312156148d4576148d3612e7f565b5b60006148e2848285016148a9565b91505092915050565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b60006149476032836131dc565b9150614952826148eb565b604082019050919050565b600060208201905081810360008301526149768161493a565b9050919050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006149d96021836131dc565b91506149e48261497d565b604082019050919050565b60006020820190508181036000830152614a08816149cc565b9050919050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000614a6b6028836131dc565b9150614a7682614a0f565b604082019050919050565b60006020820190508181036000830152614a9a81614a5e565b9050919050565b6000604082019050614ab66000830185612f5d565b614ac36020830184612f5d565b9392505050565b7f45524332393831526f79616c746965733a20546f6f2068696768000000000000600082015250565b6000614b00601a836131dc565b9150614b0b82614aca565b602082019050919050565b60006020820190508181036000830152614b2f81614af3565b9050919050565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b6000614b926029836131dc565b9150614b9d82614b36565b604082019050919050565b60006020820190508181036000830152614bc181614b85565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614c246025836131dc565b9150614c2f82614bc8565b604082019050919050565b60006020820190508181036000830152614c5381614c17565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000614cb6602a836131dc565b9150614cc182614c5a565b604082019050919050565b60006020820190508181036000830152614ce581614ca9565b9050919050565b60006040820190508181036000830152614d068185613871565b90508181036020830152614d1a8184613871565b90509392505050565b600060a082019050614d38600083018861327b565b614d45602083018761327b565b8181036040830152614d578186613871565b90508181036060830152614d6b8185613871565b90508181036080830152614d7f8184614023565b90509695505050505050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b6000614de76029836131dc565b9150614df282614d8b565b604082019050919050565b60006020820190508181036000830152614e1681614dda565b905091905056fea264697066735822122017547a6a2e11df43332e1e3da50153982c6e502f205cbb86ceb8c5808a60c50064736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000e445fb0297f7d1f507df708185946210eb6a9de6000000000000000000000000000000000000000000000000000000000000002268747470733a2f2f3070726f642e696e667572612d697066732e696f2f697066732f000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : uri_ (string): https://0prod.infura-ipfs.io/ipfs/
Arg [1] : minter_ (address): 0xe445Fb0297F7D1f507dF708185946210eB6a9DE6
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 000000000000000000000000e445fb0297f7d1f507df708185946210eb6a9de6
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000022
Arg [3] : 68747470733a2f2f3070726f642e696e667572612d697066732e696f2f697066
Arg [4] : 732f000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
267:7960:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2339:305:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3840:217:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7445:87;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;467:43;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;550:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13969:870:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2008:189;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;517:26:13;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;693:63:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;836:329:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;1245:294:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;737:142:15;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2801:542:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2713:1054:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;808:38:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1824:101:16;;;:::i;:::-;;8120:105:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4417:664;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1194:85:16;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2004:408:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1060:21:3;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;713:174:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5612:1764;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7819:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3659:210:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;943:246:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2074:198:16;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7607:86:13;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2339:305:3;2465:7;2528:1;2509:21;;:7;:21;;;2488:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;2616:8;:12;2625:2;2616:12;;;;;;;;;;;:21;2629:7;2616:21;;;;;;;;;;;;;;;;2609:28;;2339:305;;;;:::o;3840:217:13:-;3987:4;4014:36;4038:11;4014:23;:36::i;:::-;4007:43;;3840:217;;;:::o;7445:87::-;1087:13:16;:11;:13::i;:::-;7510:15:13::1;7518:6;7510:7;:15::i;:::-;7445:87:::0;:::o;467:43::-;;;;;;;;;;;;;;;;;;;:::o;550:21::-;;;;;;;;;;;;;:::o;13969:870:3:-;14175:15;:2;:13;;;:15::i;:::-;14171:662;;;14243:2;14226:38;;;14286:8;14316:4;14342:2;14366:6;14394:4;14226:190;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;14206:617;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;14699:6;14692:14;;;;;;;;;;;:::i;:::-;;;;;;;;14206:617;;;14746:62;;;;;;;;;;:::i;:::-;;;;;;;;14206:617;14489:43;;;14477:55;;;:8;:55;;;;14473:152;;14556:50;;;;;;;;;;:::i;:::-;;;;;;;;14473:152;14429:210;14171:662;13969:870;;;;;;:::o;2008:189::-;2111:13;2171:7;2180:4;:8;2185:2;2180:8;;;;;;;;;;;2154:35;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2140:50;;2008:189;;;:::o;517:26:13:-;;;;:::o;693:63:3:-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;836:329:6:-;953:16;971:21;1008:28;1039:10;:19;1050:7;1039:19;;;;;;;;;;;1008:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1079:9;:19;;;1068:30;;1153:5;1133:9;:16;;;1125:24;;:5;:24;;;;:::i;:::-;1124:34;;;;:::i;:::-;1108:50;;998:167;836:329;;;;;:::o;1245:294:13:-;1459:4;2062:10:15;2054:18;;:4;:18;;;2050:81;;2088:32;2109:10;2088:20;:32::i;:::-;2050:81;1475:57:13::1;1503:4;1509:2;1513:3;1518:7;1527:4;1475:27;:57::i;:::-;1245:294:::0;;;;;;:::o;737:142:15:-;836:42;737:142;:::o;2801:542:3:-;2952:16;3024:3;:10;3005:8;:15;:29;2984:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;3112:30;3159:8;:15;3145:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3112:63;;3191:9;3186:120;3210:8;:15;3206:1;:19;3186:120;;;3265:30;3275:8;3284:1;3275:11;;;;;;;;:::i;:::-;;;;;;;;3288:3;3292:1;3288:6;;;;;;;;:::i;:::-;;;;;;;;3265:9;:30::i;:::-;3246:13;3260:1;3246:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;3227:3;;;;:::i;:::-;;;3186:120;;;;3323:13;3316:20;;;2801:542;;;;:::o;2713:1054:13:-;632:6;;;;;;;;;;;618:20;;:10;:20;;;610:29;;;;;;3004:17:::1;:24;2990:3;:10;:38;:92;;;;;3062:13;:20;3048:3;:10;:34;2990:92;2969:170;;;;;;;;;;;;:::i;:::-;;;;;;;;;3149:32;3160:2;3164:3;3169:7;3149:32;;;;;;;;;;;::::0;:10:::1;:32::i;:::-;3197:9;3192:335;3212:3;:10;3208:1;:14;3192:335;;;3266:1;3247:13;3261:1;3247:16;;;;;;;;:::i;:::-;;;;;;;;:20;3243:201;;;3287:142;3325:3;3329:1;3325:6;;;;;;;;:::i;:::-;;;;;;;;3353:17;3371:1;3353:20;;;;;;;;:::i;:::-;;;;;;;;3395:13;3409:1;3395:16;;;;;;;;:::i;:::-;;;;;;;;3287;:142::i;:::-;3243:201;3504:9;3514:1;3504:12;;;;;;;;:::i;:::-;;;;;;;;3489:4;:12;3494:3;3498:1;3494:6;;;;;;;;:::i;:::-;;;;;;;;3489:12;;;;;;;;;;;:27;;;;;;;;;;;;:::i;:::-;;3224:3;;;;;:::i;:::-;;;;3192:335;;;;3537:13;3565:9:::0;3577:1:::1;3565:13;;3560:171;3584:3;:10;3580:1;:14;3560:171;;;3620:9;3615:106;3639:7;:14;3635:1;:18;3615:106;;;3696:7;3704:1;3696:10;;;;;;;;:::i;:::-;;;;;;;;3687:3;3691:1;3687:6;;;;;;;;:::i;:::-;;;;;;;;:19;;;;:::i;:::-;3678:28;;;;;:::i;:::-;;;3655:3;;;;;:::i;:::-;;;;3615:106;;;;3596:3;;;;;:::i;:::-;;;;3560:171;;;;3755:5;3740:11;;:20;;;;;;;:::i;:::-;;;;;;;;2959:808;2713:1054:::0;;;;;;:::o;808:38:3:-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1824:101:16:-;1087:13;:11;:13::i;:::-;1888:30:::1;1915:1;1888:18;:30::i;:::-;1824:101::o:0;8120:105:13:-;1087:13:16;:11;:13::i;:::-;8215:3:13::1;8199:4;:13;8204:7;8199:13;;;;;;;;;;;:19;;;;;;;;;;;;:::i;:::-;;8120:105:::0;;:::o;4417:664::-;632:6;;;;;;;;;;;618:20;;:10;:20;;;610:29;;;;;;4659:1:::1;4645:16;;:2;:16;;::::0;4637:53:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;4726:1;4701:8;:17:::0;4710:7:::1;4701:17;;;;;;;;;;;:21;4719:2;4701:21;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;4752:1;4737:11;;:16;;;;;;;:::i;:::-;;;;;;;;4779:3;4763:4;:13;4768:7;4763:13;;;;;;;;;;;:19;;;;;;;;;;;;:::i;:::-;;4812:1;4797:12;:16;4793:104;;;4829:57;4846:7;4855:16;4873:12;4829:16;:57::i;:::-;4793:104;4907:16;4926:12;:10;:12::i;:::-;4907:31;;4990:7;4953:57;;4986:1;4953:57;;4968:8;4953:57;;;4999:7;5008:1;4953:57;;;;;;;:::i;:::-;;;;;;;;5059:2;5025:49;;5050:7;5025:49;;5040:8;5025:49;;;5063:7;5072:1;5025:49;;;;;;;:::i;:::-;;;;;;;;4627:454;4417:664:::0;;;;;;:::o;1194:85:16:-;1240:7;1266:6;;;;;;;;;;;1259:13;;1194:85;:::o;2004:408:13:-;632:6;;;;;;;;;;;618:20;;:10;:20;;;610:29;;;;;;2212:30:::1;2218:7;2227:2;2231:6;2212:30;;;;;;;;;;;::::0;:5:::1;:30::i;:::-;2271:1;2256:12;:16;2252:99;;;2288:52;2305:2;2309:16;2327:12;2288:16;:52::i;:::-;2252:99;2371:3;2360:4;:8;2365:2;2360:8;;;;;;;;;;;:14;;;;;;;;;;;;:::i;:::-;;2399:6;2384:11;;:21;;;;;;;:::i;:::-;;;;;;;;2004:408:::0;;;;;;:::o;1060:21:3:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;713:174:13:-;817:8;2227:30:15;2248:8;2227:20;:30::i;:::-;837:43:13::1;861:8;871;837:23;:43::i;:::-;713:174:::0;;;:::o;5612:1764::-;632:6;;;;;;;;;;;618:20;;:10;:20;;;610:29;;;;;;5925:17:::1;:24;5906:8;:15;:43;:102;;;;;5988:13;:20;5969:8;:15;:39;5906:102;5885:180;;;;;;;;;;;;:::i;:::-;;;;;;;;;6076:16;6095:12;:10;:12::i;:::-;6076:31;;6123:9;6118:1180;6142:8;:15;6138:1;:19;6118:1180;;;6207:1;6178:8;:21:::0;6187:8:::1;6196:1;6187:11;;;;;;;;:::i;:::-;;;;;;;;6178:21;;;;;;;;;;;:25;6200:2;6178:25;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;6272:186;6320:8;6354:1;6374:2;6394:8;6403:1;6394:11;;;;;;;;:::i;:::-;;;;;;;;6423:1;6272:186;;;;;;;;;;;::::0;:30:::1;:186::i;:::-;6528:1;6509:13;6523:1;6509:16;;;;;;;;:::i;:::-;;;;;;;;:20;6505:206;;;6549:147;6587:8;6596:1;6587:11;;;;;;;;:::i;:::-;;;;;;;;6620:17;6638:1;6620:20;;;;;;;;:::i;:::-;;;;;;;;6662:13;6676:1;6662:16;;;;;;;;:::i;:::-;;;;;;;;6549;:147::i;:::-;6505:206;6776:9;6786:1;6776:12;;;;;;;;:::i;:::-;;;;;;;;6756:4;:17;6761:8;6770:1;6761:11;;;;;;;;:::i;:::-;;;;;;;;6756:17;;;;;;;;;;;:32;;;;;;;;;;;;:::i;:::-;;6883:1;6860:25;;:8;6869:1;6860:11;;;;;;;;:::i;:::-;;;;;;;;:25;;::::0;6856:432:::1;;6947:2;6910:56;;6943:1;6910:56;;6925:8;6910:56;;;6951:8;6960:1;6951:11;;;;;;;;:::i;:::-;;;;;;;;6964:1;6910:56;;;;;;;:::i;:::-;;;;;;;;6856:432;;;7108:8;7117:1;7108:11;;;;;;;;:::i;:::-;;;;;;;;7010:183;;7084:1;7010:183;;7046:8;7010:183;;;7141:8;7150:1;7141:11;;;;;;;;:::i;:::-;;;;;;;;7174:1;7010:183;;;;;;;:::i;:::-;;;;;;;;7254:2;7216:57;;7241:8;7250:1;7241:11;;;;;;;;:::i;:::-;;;;;;;;7216:57;;7231:8;7216:57;;;7258:8;7267:1;7258:11;;;;;;;;:::i;:::-;;;;;;;;7271:1;7216:57;;;;;;;:::i;:::-;;;;;;;;6856:432;6159:3;;;;;:::i;:::-;;;;6118:1180;;;;7354:8;:15;7339:11;;:30;;;;;;;:::i;:::-;;;;;;;;5875:1501;5612:1764:::0;;;;;;:::o;7819:208::-;1087:13:16;:11;:13::i;:::-;7963:57:13::1;7980:7;7989:16;8007:12;7963:16;:57::i;:::-;7819:208:::0;;;:::o;3659:210:3:-;3798:4;3825:18;:27;3844:7;3825:27;;;;;;;;;;;;;;;:37;3853:8;3825:37;;;;;;;;;;;;;;;;;;;;;;;;;3818:44;;3659:210;;;;:::o;943:246:13:-;1107:4;2062:10:15;2054:18;;:4;:18;;;2050:81;;2088:32;2109:10;2088:20;:32::i;:::-;2050:81;1127:55:13::1;1150:4;1156:2;1160:7;1169:6;1177:4;1127:22;:55::i;:::-;943:246:::0;;;;;;:::o;2074:198:16:-;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;7607:86:13:-;1087:13:16;:11;:13::i;:::-;7679:7:13::1;7670:6;;:16;;;;;;;;;;;;;;;;;;7607:86:::0;:::o;365:273:5:-;490:4;544:35;529:50;;;:11;:50;;;;:102;;;;595:36;619:11;595:23;:36::i;:::-;529:102;510:121;;365:273;;;:::o;1352:130:16:-;1426:12;:10;:12::i;:::-;1415:23;;:7;:5;:7::i;:::-;:23;;;1407:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1352:130::o;8698:89:3:-;8774:6;8764:7;:16;;;;;;;;;;;;:::i;:::-;;8698:89;:::o;1175:320:0:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;2285:412:15:-;2522:1;836:42;2474:45;;;:49;2470:221;;;836:42;2544;;;2595:4;2602:8;2544:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2539:142;;2657:8;2638:28;;;;;;;;;;;:::i;:::-;;;;;;;;2539:142;2470:221;2285:412;:::o;4397:430:3:-;4630:12;:10;:12::i;:::-;4622:20;;:4;:20;;;:60;;;;4646:36;4663:4;4669:12;:10;:12::i;:::-;4646:16;:36::i;:::-;4622:60;4601:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;4768:52;4791:4;4797:2;4801:3;4806:7;4815:4;4768:22;:52::i;:::-;4397:430;;;;;:::o;10295:916::-;10481:1;10467:16;;:2;:16;;;10459:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;10566:7;:14;10552:3;:10;:28;10531:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;10657:16;10676:12;:10;:12::i;:::-;10657:31;;10699:66;10720:8;10738:1;10742:2;10746:3;10751:7;10760:4;10699:20;:66::i;:::-;10781:9;10776:179;10800:3;:10;10796:1;:14;10776:179;;;10855:7;10863:1;10855:10;;;;;;;;:::i;:::-;;;;;;;;10831:8;:16;10840:3;10844:1;10840:6;;;;;;;;:::i;:::-;;;;;;;;10831:16;;;;;;;;;;;:20;10848:2;10831:20;;;;;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;10921:2;10884:60;;10917:1;10884:60;;10899:8;10884:60;;;10925:3;10929:1;10925:6;;;;;;;;:::i;:::-;;;;;;;;10933:7;10941:1;10933:10;;;;;;;;:::i;:::-;;;;;;;;10884:60;;;;;;;:::i;:::-;;;;;;;;10812:3;;;;;:::i;:::-;;;;10776:179;;;;10965:65;10985:8;11003:1;11007:2;11011:3;11016:7;11025:4;10965:19;:65::i;:::-;11041:163;11090:8;11120:1;11136:2;11152:3;11169:7;11190:4;11041:35;:163::i;:::-;10449:762;10295:916;;;;:::o;537:255:6:-;680:5;671;:14;;663:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;748:37;;;;;;;;760:9;748:37;;;;;;778:5;748:37;;;;;726:10;:19;737:7;726:19;;;;;;;;;;;:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;537:255;;;:::o;2426:187:16:-;2499:16;2518:6;;;;;;;;;;;2499:25;;2543:8;2534:6;;:17;;;;;;;;;;;;;;;;;;2597:8;2566:40;;2587:8;2566:40;;;;;;;;;;;;2489:124;2426:187;:::o;640:96:1:-;693:7;719:10;712:17;;640:96;:::o;9160:790:3:-;9321:1;9307:16;;:2;:16;;;9299:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;9372:16;9391:12;:10;:12::i;:::-;9372:31;;9413:20;9436:21;9454:2;9436:17;:21::i;:::-;9413:44;;9467:24;9494:25;9512:6;9494:17;:25::i;:::-;9467:52;;9530:66;9551:8;9569:1;9573:2;9577:3;9582:7;9591:4;9530:20;:66::i;:::-;9627:6;9607:8;:12;9616:2;9607:12;;;;;;;;;;;:16;9620:2;9607:16;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;9685:2;9648:52;;9681:1;9648:52;;9663:8;9648:52;;;9689:2;9693:6;9648:52;;;;;;;:::i;:::-;;;;;;;;9711:65;9731:8;9749:1;9753:2;9757:3;9762:7;9771:4;9711:19;:65::i;:::-;9787:156;9831:8;9861:1;9877:2;9893;9909:6;9929:4;9787:30;:156::i;:::-;9289:661;;;9160:790;;;;:::o;3411:181::-;3533:52;3552:12;:10;:12::i;:::-;3566:8;3576;3533:18;:52::i;:::-;3411:181;;:::o;3936:389::-;4144:12;:10;:12::i;:::-;4136:20;;:4;:20;;;:60;;;;4160:36;4177:4;4183:12;:10;:12::i;:::-;4160:16;:36::i;:::-;4136:60;4115:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;4273:45;4291:4;4297:2;4301;4305:6;4313:4;4273:17;:45::i;:::-;3936:389;;;;;:::o;1260:349::-;1402:4;1456:26;1441:41;;;:11;:41;;;;:109;;;;1513:37;1498:52;;;:11;:52;;;;1441:109;:161;;;;1566:36;1590:11;1566:23;:36::i;:::-;1441:161;1422:180;;1260:349;;;:::o;6601:1274::-;6834:7;:14;6820:3;:10;:28;6799:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;6946:1;6932:16;;:2;:16;;;6924:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;7001:16;7020:12;:10;:12::i;:::-;7001:31;;7043:60;7064:8;7074:4;7080:2;7084:3;7089:7;7098:4;7043:20;:60::i;:::-;7119:9;7114:454;7138:3;:10;7134:1;:14;7114:454;;;7169:10;7182:3;7186:1;7182:6;;;;;;;;:::i;:::-;;;;;;;;7169:19;;7202:14;7219:7;7227:1;7219:10;;;;;;;;:::i;:::-;;;;;;;;7202:27;;7244:19;7266:8;:12;7275:2;7266:12;;;;;;;;;;;:18;7279:4;7266:18;;;;;;;;;;;;;;;;7244:40;;7338:6;7323:11;:21;;7298:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;7497:6;7483:11;:20;7462:8;:12;7471:2;7462:12;;;;;;;;;;;:18;7475:4;7462:18;;;;;;;;;;;;;;;:41;;;;7551:6;7531:8;:12;7540:2;7531:12;;;;;;;;;;;:16;7544:2;7531:16;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;7155:413;;;7150:3;;;;:::i;:::-;;;7114:454;;;;7613:2;7583:47;;7607:4;7583:47;;7597:8;7583:47;;;7617:3;7622:7;7583:47;;;;;;;:::i;:::-;;;;;;;;7641:59;7661:8;7671:4;7677:2;7681:3;7686:7;7695:4;7641:19;:59::i;:::-;7711:157;7760:8;7782:4;7800:2;7816:3;7833:7;7854:4;7711:35;:157::i;:::-;6789:1086;6601:1274;;;;;:::o;12603:214::-;;;;;;;:::o;13750:213::-;;;;;;;:::o;14845:946::-;15077:15;:2;:13;;;:15::i;:::-;15073:712;;;15145:2;15128:43;;;15193:8;15223:4;15249:3;15274:7;15303:4;15128:197;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;15108:667;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;15651:6;15644:14;;;;;;;;;;;:::i;:::-;;;;;;;;15108:667;;;15698:62;;;;;;;;;;:::i;:::-;;;;;;;;15108:667;15419:48;;;15407:60;;;:8;:60;;;;15382:195;;15508:50;;;;;;;;;;:::i;:::-;;;;;;;;15382:195;15338:253;15073:712;14845:946;;;;;;:::o;15797:221::-;15887:16;15919:22;15958:1;15944:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15919:41;;15981:7;15970:5;15976:1;15970:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;16006:5;15999:12;;;15797:221;;;:::o;11346:323::-;11496:8;11487:17;;:5;:17;;;11479:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;11598:8;11560:18;:25;11579:5;11560:25;;;;;;;;;;;;;;;:35;11586:8;11560:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;11643:8;11621:41;;11636:5;11621:41;;;11653:8;11621:41;;;;;;:::i;:::-;;;;;;;;11346:323;;;:::o;5277:978::-;5472:1;5458:16;;:2;:16;;;5450:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;5527:16;5546:12;:10;:12::i;:::-;5527:31;;5568:20;5591:21;5609:2;5591:17;:21::i;:::-;5568:44;;5622:24;5649:25;5667:6;5649:17;:25::i;:::-;5622:52;;5685:60;5706:8;5716:4;5722:2;5726:3;5731:7;5740:4;5685:20;:60::i;:::-;5756:19;5778:8;:12;5787:2;5778:12;;;;;;;;;;;:18;5791:4;5778:18;;;;;;;;;;;;;;;;5756:40;;5842:6;5827:11;:21;;5806:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;5985:6;5971:11;:20;5950:8;:12;5959:2;5950:12;;;;;;;;;;;:18;5963:4;5950:18;;;;;;;;;;;;;;;:41;;;;6031:6;6011:8;:12;6020:2;6011:12;;;;;;;;;;;:16;6024:2;6011:16;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;6084:2;6053:46;;6078:4;6053:46;;6068:8;6053:46;;;6088:2;6092:6;6053:46;;;;;;;:::i;:::-;;;;;;;;6110:59;6130:8;6140:4;6146:2;6150:3;6155:7;6164:4;6110:19;:59::i;:::-;6180:68;6211:8;6221:4;6227:2;6231;6235:6;6243:4;6180:30;:68::i;:::-;5440:815;;;;5277:978;;;;;:::o;829:155:4:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:18:-;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:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:77::-;878:7;907:5;896:16;;841:77;;;:::o;924:122::-;997:24;1015:5;997:24;:::i;:::-;990:5;987:35;977:63;;1036:1;1033;1026:12;977:63;924:122;:::o;1052:139::-;1098:5;1136:6;1123:20;1114:29;;1152:33;1179:5;1152:33;:::i;:::-;1052:139;;;;:::o;1197:474::-;1265:6;1273;1322:2;1310:9;1301:7;1297:23;1293:32;1290:119;;;1328:79;;:::i;:::-;1290:119;1448:1;1473:53;1518:7;1509:6;1498:9;1494:22;1473:53;:::i;:::-;1463:63;;1419:117;1575:2;1601:53;1646:7;1637:6;1626:9;1622:22;1601:53;:::i;:::-;1591:63;;1546:118;1197:474;;;;;:::o;1677:118::-;1764:24;1782:5;1764:24;:::i;:::-;1759:3;1752:37;1677:118;;:::o;1801:222::-;1894:4;1932:2;1921:9;1917:18;1909:26;;1945:71;2013:1;2002:9;1998:17;1989:6;1945:71;:::i;:::-;1801:222;;;;:::o;2029:149::-;2065:7;2105:66;2098:5;2094:78;2083:89;;2029:149;;;:::o;2184:120::-;2256:23;2273:5;2256:23;:::i;:::-;2249:5;2246:34;2236:62;;2294:1;2291;2284:12;2236:62;2184:120;:::o;2310:137::-;2355:5;2393:6;2380:20;2371:29;;2409:32;2435:5;2409:32;:::i;:::-;2310:137;;;;:::o;2453:327::-;2511:6;2560:2;2548:9;2539:7;2535:23;2531:32;2528:119;;;2566:79;;:::i;:::-;2528:119;2686:1;2711:52;2755:7;2746:6;2735:9;2731:22;2711:52;:::i;:::-;2701:62;;2657:116;2453:327;;;;:::o;2786:90::-;2820:7;2863:5;2856:13;2849:21;2838:32;;2786:90;;;:::o;2882:109::-;2963:21;2978:5;2963:21;:::i;:::-;2958:3;2951:34;2882:109;;:::o;2997:210::-;3084:4;3122:2;3111:9;3107:18;3099:26;;3135:65;3197:1;3186:9;3182:17;3173:6;3135:65;:::i;:::-;2997:210;;;;:::o;3213:117::-;3322:1;3319;3312:12;3336:117;3445:1;3442;3435:12;3459:102;3500:6;3551:2;3547:7;3542:2;3535:5;3531:14;3527:28;3517:38;;3459:102;;;:::o;3567:180::-;3615:77;3612:1;3605:88;3712:4;3709:1;3702:15;3736:4;3733:1;3726:15;3753:281;3836:27;3858:4;3836:27;:::i;:::-;3828:6;3824:40;3966:6;3954:10;3951:22;3930:18;3918:10;3915:34;3912:62;3909:88;;;3977:18;;:::i;:::-;3909:88;4017:10;4013:2;4006:22;3796:238;3753:281;;:::o;4040:129::-;4074:6;4101:20;;:::i;:::-;4091:30;;4130:33;4158:4;4150:6;4130:33;:::i;:::-;4040:129;;;:::o;4175:308::-;4237:4;4327:18;4319:6;4316:30;4313:56;;;4349:18;;:::i;:::-;4313:56;4387:29;4409:6;4387:29;:::i;:::-;4379:37;;4471:4;4465;4461:15;4453:23;;4175:308;;;:::o;4489:154::-;4573:6;4568:3;4563;4550:30;4635:1;4626:6;4621:3;4617:16;4610:27;4489:154;;;:::o;4649:412::-;4727:5;4752:66;4768:49;4810:6;4768:49;:::i;:::-;4752:66;:::i;:::-;4743:75;;4841:6;4834:5;4827:21;4879:4;4872:5;4868:16;4917:3;4908:6;4903:3;4899:16;4896:25;4893:112;;;4924:79;;:::i;:::-;4893:112;5014:41;5048:6;5043:3;5038;5014:41;:::i;:::-;4733:328;4649:412;;;;;:::o;5081:340::-;5137:5;5186:3;5179:4;5171:6;5167:17;5163:27;5153:122;;5194:79;;:::i;:::-;5153:122;5311:6;5298:20;5336:79;5411:3;5403:6;5396:4;5388:6;5384:17;5336:79;:::i;:::-;5327:88;;5143:278;5081:340;;;;:::o;5427:509::-;5496:6;5545:2;5533:9;5524:7;5520:23;5516:32;5513:119;;;5551:79;;:::i;:::-;5513:119;5699:1;5688:9;5684:17;5671:31;5729:18;5721:6;5718:30;5715:117;;;5751:79;;:::i;:::-;5715:117;5856:63;5911:7;5902:6;5891:9;5887:22;5856:63;:::i;:::-;5846:73;;5642:287;5427:509;;;;:::o;5942:99::-;5994:6;6028:5;6022:12;6012:22;;5942:99;;;:::o;6047:169::-;6131:11;6165:6;6160:3;6153:19;6205:4;6200:3;6196:14;6181:29;;6047:169;;;;:::o;6222:307::-;6290:1;6300:113;6314:6;6311:1;6308:13;6300:113;;;6399:1;6394:3;6390:11;6384:18;6380:1;6375:3;6371:11;6364:39;6336:2;6333:1;6329:10;6324:15;;6300:113;;;6431:6;6428:1;6425:13;6422:101;;;6511:1;6502:6;6497:3;6493:16;6486:27;6422:101;6271:258;6222:307;;;:::o;6535:364::-;6623:3;6651:39;6684:5;6651:39;:::i;:::-;6706:71;6770:6;6765:3;6706:71;:::i;:::-;6699:78;;6786:52;6831:6;6826:3;6819:4;6812:5;6808:16;6786:52;:::i;:::-;6863:29;6885:6;6863:29;:::i;:::-;6858:3;6854:39;6847:46;;6627:272;6535:364;;;;:::o;6905:313::-;7018:4;7056:2;7045:9;7041:18;7033:26;;7105:9;7099:4;7095:20;7091:1;7080:9;7076:17;7069:47;7133:78;7206:4;7197:6;7133:78;:::i;:::-;7125:86;;6905:313;;;;:::o;7224:118::-;7311:24;7329:5;7311:24;:::i;:::-;7306:3;7299:37;7224:118;;:::o;7348:222::-;7441:4;7479:2;7468:9;7464:18;7456:26;;7492:71;7560:1;7549:9;7545:17;7536:6;7492:71;:::i;:::-;7348:222;;;;:::o;7576:307::-;7637:4;7727:18;7719:6;7716:30;7713:56;;;7749:18;;:::i;:::-;7713:56;7787:29;7809:6;7787:29;:::i;:::-;7779:37;;7871:4;7865;7861:15;7853:23;;7576:307;;;:::o;7889:410::-;7966:5;7991:65;8007:48;8048:6;8007:48;:::i;:::-;7991:65;:::i;:::-;7982:74;;8079:6;8072:5;8065:21;8117:4;8110:5;8106:16;8155:3;8146:6;8141:3;8137:16;8134:25;8131:112;;;8162:79;;:::i;:::-;8131:112;8252:41;8286:6;8281:3;8276;8252:41;:::i;:::-;7972:327;7889:410;;;;;:::o;8318:338::-;8373:5;8422:3;8415:4;8407:6;8403:17;8399:27;8389:122;;8430:79;;:::i;:::-;8389:122;8547:6;8534:20;8572:78;8646:3;8638:6;8631:4;8623:6;8619:17;8572:78;:::i;:::-;8563:87;;8379:277;8318:338;;;;:::o;8662:1235::-;8775:6;8783;8791;8799;8807;8815;8864:3;8852:9;8843:7;8839:23;8835:33;8832:120;;;8871:79;;:::i;:::-;8832:120;8991:1;9016:53;9061:7;9052:6;9041:9;9037:22;9016:53;:::i;:::-;9006:63;;8962:117;9118:2;9144:53;9189:7;9180:6;9169:9;9165:22;9144:53;:::i;:::-;9134:63;;9089:118;9246:2;9272:53;9317:7;9308:6;9297:9;9293:22;9272:53;:::i;:::-;9262:63;;9217:118;9374:2;9400:53;9445:7;9436:6;9425:9;9421:22;9400:53;:::i;:::-;9390:63;;9345:118;9502:3;9529:53;9574:7;9565:6;9554:9;9550:22;9529:53;:::i;:::-;9519:63;;9473:119;9659:3;9648:9;9644:19;9631:33;9691:18;9683:6;9680:30;9677:117;;;9713:79;;:::i;:::-;9677:117;9818:62;9872:7;9863:6;9852:9;9848:22;9818:62;:::i;:::-;9808:72;;9602:288;8662:1235;;;;;;;;:::o;9903:329::-;9962:6;10011:2;9999:9;9990:7;9986:23;9982:32;9979:119;;;10017:79;;:::i;:::-;9979:119;10137:1;10162:53;10207:7;10198:6;10187:9;10183:22;10162:53;:::i;:::-;10152:63;;10108:117;9903:329;;;;:::o;10238:474::-;10306:6;10314;10363:2;10351:9;10342:7;10338:23;10334:32;10331:119;;;10369:79;;:::i;:::-;10331:119;10489:1;10514:53;10559:7;10550:6;10539:9;10535:22;10514:53;:::i;:::-;10504:63;;10460:117;10616:2;10642:53;10687:7;10678:6;10667:9;10663:22;10642:53;:::i;:::-;10632:63;;10587:118;10238:474;;;;;:::o;10718:::-;10786:6;10794;10843:2;10831:9;10822:7;10818:23;10814:32;10811:119;;;10849:79;;:::i;:::-;10811:119;10969:1;10994:53;11039:7;11030:6;11019:9;11015:22;10994:53;:::i;:::-;10984:63;;10940:117;11096:2;11122:53;11167:7;11158:6;11147:9;11143:22;11122:53;:::i;:::-;11112:63;;11067:118;10718:474;;;;;:::o;11198:332::-;11319:4;11357:2;11346:9;11342:18;11334:26;;11370:71;11438:1;11427:9;11423:17;11414:6;11370:71;:::i;:::-;11451:72;11519:2;11508:9;11504:18;11495:6;11451:72;:::i;:::-;11198:332;;;;;:::o;11536:311::-;11613:4;11703:18;11695:6;11692:30;11689:56;;;11725:18;;:::i;:::-;11689:56;11775:4;11767:6;11763:17;11755:25;;11835:4;11829;11825:15;11817:23;;11536:311;;;:::o;11853:117::-;11962:1;11959;11952:12;11993:710;12089:5;12114:81;12130:64;12187:6;12130:64;:::i;:::-;12114:81;:::i;:::-;12105:90;;12215:5;12244:6;12237:5;12230:21;12278:4;12271:5;12267:16;12260:23;;12331:4;12323:6;12319:17;12311:6;12307:30;12360:3;12352:6;12349:15;12346:122;;;12379:79;;:::i;:::-;12346:122;12494:6;12477:220;12511:6;12506:3;12503:15;12477:220;;;12586:3;12615:37;12648:3;12636:10;12615:37;:::i;:::-;12610:3;12603:50;12682:4;12677:3;12673:14;12666:21;;12553:144;12537:4;12532:3;12528:14;12521:21;;12477:220;;;12481:21;12095:608;;11993:710;;;;;:::o;12726:370::-;12797:5;12846:3;12839:4;12831:6;12827:17;12823:27;12813:122;;12854:79;;:::i;:::-;12813:122;12971:6;12958:20;12996:94;13086:3;13078:6;13071:4;13063:6;13059:17;12996:94;:::i;:::-;12987:103;;12803:293;12726:370;;;;:::o;13102:1509::-;13256:6;13264;13272;13280;13288;13337:3;13325:9;13316:7;13312:23;13308:33;13305:120;;;13344:79;;:::i;:::-;13305:120;13464:1;13489:53;13534:7;13525:6;13514:9;13510:22;13489:53;:::i;:::-;13479:63;;13435:117;13591:2;13617:53;13662:7;13653:6;13642:9;13638:22;13617:53;:::i;:::-;13607:63;;13562:118;13747:2;13736:9;13732:18;13719:32;13778:18;13770:6;13767:30;13764:117;;;13800:79;;:::i;:::-;13764:117;13905:78;13975:7;13966:6;13955:9;13951:22;13905:78;:::i;:::-;13895:88;;13690:303;14060:2;14049:9;14045:18;14032:32;14091:18;14083:6;14080:30;14077:117;;;14113:79;;:::i;:::-;14077:117;14218:78;14288:7;14279:6;14268:9;14264:22;14218:78;:::i;:::-;14208:88;;14003:303;14373:3;14362:9;14358:19;14345:33;14405:18;14397:6;14394:30;14391:117;;;14427:79;;:::i;:::-;14391:117;14532:62;14586:7;14577:6;14566:9;14562:22;14532:62;:::i;:::-;14522:72;;14316:288;13102:1509;;;;;;;;:::o;14617:60::-;14645:3;14666:5;14659:12;;14617:60;;;:::o;14683:142::-;14733:9;14766:53;14784:34;14793:24;14811:5;14793:24;:::i;:::-;14784:34;:::i;:::-;14766:53;:::i;:::-;14753:66;;14683:142;;;:::o;14831:126::-;14881:9;14914:37;14945:5;14914:37;:::i;:::-;14901:50;;14831:126;;;:::o;14963:158::-;15045:9;15078:37;15109:5;15078:37;:::i;:::-;15065:50;;14963:158;;;:::o;15127:195::-;15246:69;15309:5;15246:69;:::i;:::-;15241:3;15234:82;15127:195;;:::o;15328:286::-;15453:4;15491:2;15480:9;15476:18;15468:26;;15504:103;15604:1;15593:9;15589:17;15580:6;15504:103;:::i;:::-;15328:286;;;;:::o;15620:311::-;15697:4;15787:18;15779:6;15776:30;15773:56;;;15809:18;;:::i;:::-;15773:56;15859:4;15851:6;15847:17;15839:25;;15919:4;15913;15909:15;15901:23;;15620:311;;;:::o;15954:710::-;16050:5;16075:81;16091:64;16148:6;16091:64;:::i;:::-;16075:81;:::i;:::-;16066:90;;16176:5;16205:6;16198:5;16191:21;16239:4;16232:5;16228:16;16221:23;;16292:4;16284:6;16280:17;16272:6;16268:30;16321:3;16313:6;16310:15;16307:122;;;16340:79;;:::i;:::-;16307:122;16455:6;16438:220;16472:6;16467:3;16464:15;16438:220;;;16547:3;16576:37;16609:3;16597:10;16576:37;:::i;:::-;16571:3;16564:50;16643:4;16638:3;16634:14;16627:21;;16514:144;16498:4;16493:3;16489:14;16482:21;;16438:220;;;16442:21;16056:608;;15954:710;;;;;:::o;16687:370::-;16758:5;16807:3;16800:4;16792:6;16788:17;16784:27;16774:122;;16815:79;;:::i;:::-;16774:122;16932:6;16919:20;16957:94;17047:3;17039:6;17032:4;17024:6;17020:17;16957:94;:::i;:::-;16948:103;;16764:293;16687:370;;;;:::o;17063:894::-;17181:6;17189;17238:2;17226:9;17217:7;17213:23;17209:32;17206:119;;;17244:79;;:::i;:::-;17206:119;17392:1;17381:9;17377:17;17364:31;17422:18;17414:6;17411:30;17408:117;;;17444:79;;:::i;:::-;17408:117;17549:78;17619:7;17610:6;17599:9;17595:22;17549:78;:::i;:::-;17539:88;;17335:302;17704:2;17693:9;17689:18;17676:32;17735:18;17727:6;17724:30;17721:117;;;17757:79;;:::i;:::-;17721:117;17862:78;17932:7;17923:6;17912:9;17908:22;17862:78;:::i;:::-;17852:88;;17647:303;17063:894;;;;;:::o;17963:114::-;18030:6;18064:5;18058:12;18048:22;;17963:114;;;:::o;18083:184::-;18182:11;18216:6;18211:3;18204:19;18256:4;18251:3;18247:14;18232:29;;18083:184;;;;:::o;18273:132::-;18340:4;18363:3;18355:11;;18393:4;18388:3;18384:14;18376:22;;18273:132;;;:::o;18411:108::-;18488:24;18506:5;18488:24;:::i;:::-;18483:3;18476:37;18411:108;;:::o;18525:179::-;18594:10;18615:46;18657:3;18649:6;18615:46;:::i;:::-;18693:4;18688:3;18684:14;18670:28;;18525:179;;;;:::o;18710:113::-;18780:4;18812;18807:3;18803:14;18795:22;;18710:113;;;:::o;18859:732::-;18978:3;19007:54;19055:5;19007:54;:::i;:::-;19077:86;19156:6;19151:3;19077:86;:::i;:::-;19070:93;;19187:56;19237:5;19187:56;:::i;:::-;19266:7;19297:1;19282:284;19307:6;19304:1;19301:13;19282:284;;;19383:6;19377:13;19410:63;19469:3;19454:13;19410:63;:::i;:::-;19403:70;;19496:60;19549:6;19496:60;:::i;:::-;19486:70;;19342:224;19329:1;19326;19322:9;19317:14;;19282:284;;;19286:14;19582:3;19575:10;;18983:608;;;18859:732;;;;:::o;19597:373::-;19740:4;19778:2;19767:9;19763:18;19755:26;;19827:9;19821:4;19817:20;19813:1;19802:9;19798:17;19791:47;19855:108;19958:4;19949:6;19855:108;:::i;:::-;19847:116;;19597:373;;;;:::o;19976:321::-;20063:4;20153:18;20145:6;20142:30;20139:56;;;20175:18;;:::i;:::-;20139:56;20225:4;20217:6;20213:17;20205:25;;20285:4;20279;20275:15;20267:23;;19976:321;;;:::o;20319:945::-;20425:5;20450:91;20466:74;20533:6;20466:74;:::i;:::-;20450:91;:::i;:::-;20441:100;;20561:5;20590:6;20583:5;20576:21;20624:4;20617:5;20613:16;20606:23;;20677:4;20669:6;20665:17;20657:6;20653:30;20706:3;20698:6;20695:15;20692:122;;;20725:79;;:::i;:::-;20692:122;20840:6;20823:435;20857:6;20852:3;20849:15;20823:435;;;20946:3;20933:17;20982:18;20969:11;20966:35;20963:122;;;21004:79;;:::i;:::-;20963:122;21128:11;21120:6;21116:24;21166:47;21209:3;21197:10;21166:47;:::i;:::-;21161:3;21154:60;21243:4;21238:3;21234:14;21227:21;;20899:359;;20883:4;20878:3;20874:14;20867:21;;20823:435;;;20827:21;20431:833;;20319:945;;;;;:::o;21286:390::-;21367:5;21416:3;21409:4;21401:6;21397:17;21393:27;21383:122;;21424:79;;:::i;:::-;21383:122;21541:6;21528:20;21566:104;21666:3;21658:6;21651:4;21643:6;21639:17;21566:104;:::i;:::-;21557:113;;21373:303;21286:390;;;;:::o;21682:2127::-;21921:6;21929;21937;21945;21953;21961;22010:3;21998:9;21989:7;21985:23;21981:33;21978:120;;;22017:79;;:::i;:::-;21978:120;22137:1;22162:53;22207:7;22198:6;22187:9;22183:22;22162:53;:::i;:::-;22152:63;;22108:117;22292:2;22281:9;22277:18;22264:32;22323:18;22315:6;22312:30;22309:117;;;22345:79;;:::i;:::-;22309:117;22450:78;22520:7;22511:6;22500:9;22496:22;22450:78;:::i;:::-;22440:88;;22235:303;22605:2;22594:9;22590:18;22577:32;22636:18;22628:6;22625:30;22622:117;;;22658:79;;:::i;:::-;22622:117;22763:78;22833:7;22824:6;22813:9;22809:22;22763:78;:::i;:::-;22753:88;;22548:303;22918:2;22907:9;22903:18;22890:32;22949:18;22941:6;22938:30;22935:117;;;22971:79;;:::i;:::-;22935:117;23076:88;23156:7;23147:6;23136:9;23132:22;23076:88;:::i;:::-;23066:98;;22861:313;23241:3;23230:9;23226:19;23213:33;23273:18;23265:6;23262:30;23259:117;;;23295:79;;:::i;:::-;23259:117;23400:78;23470:7;23461:6;23450:9;23446:22;23400:78;:::i;:::-;23390:88;;23184:304;23555:3;23544:9;23540:19;23527:33;23587:18;23579:6;23576:30;23573:117;;;23609:79;;:::i;:::-;23573:117;23714:78;23784:7;23775:6;23764:9;23760:22;23714:78;:::i;:::-;23704:88;;23498:304;21682:2127;;;;;;;;:::o;23815:654::-;23893:6;23901;23950:2;23938:9;23929:7;23925:23;23921:32;23918:119;;;23956:79;;:::i;:::-;23918:119;24076:1;24101:53;24146:7;24137:6;24126:9;24122:22;24101:53;:::i;:::-;24091:63;;24047:117;24231:2;24220:9;24216:18;24203:32;24262:18;24254:6;24251:30;24248:117;;;24284:79;;:::i;:::-;24248:117;24389:63;24444:7;24435:6;24424:9;24420:22;24389:63;:::i;:::-;24379:73;;24174:288;23815:654;;;;;:::o;24475:1237::-;24589:6;24597;24605;24613;24621;24629;24678:3;24666:9;24657:7;24653:23;24649:33;24646:120;;;24685:79;;:::i;:::-;24646:120;24805:1;24830:53;24875:7;24866:6;24855:9;24851:22;24830:53;:::i;:::-;24820:63;;24776:117;24932:2;24958:53;25003:7;24994:6;24983:9;24979:22;24958:53;:::i;:::-;24948:63;;24903:118;25060:2;25086:53;25131:7;25122:6;25111:9;25107:22;25086:53;:::i;:::-;25076:63;;25031:118;25216:2;25205:9;25201:18;25188:32;25247:18;25239:6;25236:30;25233:117;;;25269:79;;:::i;:::-;25233:117;25374:63;25429:7;25420:6;25409:9;25405:22;25374:63;:::i;:::-;25364:73;;25159:288;25486:3;25513:53;25558:7;25549:6;25538:9;25534:22;25513:53;:::i;:::-;25503:63;;25457:119;25615:3;25642:53;25687:7;25678:6;25667:9;25663:22;25642:53;:::i;:::-;25632:63;;25586:119;24475:1237;;;;;;;;:::o;25718:::-;25832:6;25840;25848;25856;25864;25872;25921:3;25909:9;25900:7;25896:23;25892:33;25889:120;;;25928:79;;:::i;:::-;25889:120;26048:1;26073:53;26118:7;26109:6;26098:9;26094:22;26073:53;:::i;:::-;26063:63;;26019:117;26175:2;26201:53;26246:7;26237:6;26226:9;26222:22;26201:53;:::i;:::-;26191:63;;26146:118;26303:2;26329:53;26374:7;26365:6;26354:9;26350:22;26329:53;:::i;:::-;26319:63;;26274:118;26459:2;26448:9;26444:18;26431:32;26490:18;26482:6;26479:30;26476:117;;;26512:79;;:::i;:::-;26476:117;26617:63;26672:7;26663:6;26652:9;26648:22;26617:63;:::i;:::-;26607:73;;26402:288;26729:3;26756:53;26801:7;26792:6;26781:9;26777:22;26756:53;:::i;:::-;26746:63;;26700:119;26858:3;26885:53;26930:7;26921:6;26910:9;26906:22;26885:53;:::i;:::-;26875:63;;26829:119;25718:1237;;;;;;;;:::o;26961:116::-;27031:21;27046:5;27031:21;:::i;:::-;27024:5;27021:32;27011:60;;27067:1;27064;27057:12;27011:60;26961:116;:::o;27083:133::-;27126:5;27164:6;27151:20;27142:29;;27180:30;27204:5;27180:30;:::i;:::-;27083:133;;;;:::o;27222:468::-;27287:6;27295;27344:2;27332:9;27323:7;27319:23;27315:32;27312:119;;;27350:79;;:::i;:::-;27312:119;27470:1;27495:53;27540:7;27531:6;27520:9;27516:22;27495:53;:::i;:::-;27485:63;;27441:117;27597:2;27623:50;27665:7;27656:6;27645:9;27641:22;27623:50;:::i;:::-;27613:60;;27568:115;27222:468;;;;;:::o;27696:2127::-;27935:6;27943;27951;27959;27967;27975;28024:3;28012:9;28003:7;27999:23;27995:33;27992:120;;;28031:79;;:::i;:::-;27992:120;28151:1;28176:53;28221:7;28212:6;28201:9;28197:22;28176:53;:::i;:::-;28166:63;;28122:117;28306:2;28295:9;28291:18;28278:32;28337:18;28329:6;28326:30;28323:117;;;28359:79;;:::i;:::-;28323:117;28464:78;28534:7;28525:6;28514:9;28510:22;28464:78;:::i;:::-;28454:88;;28249:303;28619:2;28608:9;28604:18;28591:32;28650:18;28642:6;28639:30;28636:117;;;28672:79;;:::i;:::-;28636:117;28777:78;28847:7;28838:6;28827:9;28823:22;28777:78;:::i;:::-;28767:88;;28562:303;28932:2;28921:9;28917:18;28904:32;28963:18;28955:6;28952:30;28949:117;;;28985:79;;:::i;:::-;28949:117;29090:88;29170:7;29161:6;29150:9;29146:22;29090:88;:::i;:::-;29080:98;;28875:313;29255:3;29244:9;29240:19;29227:33;29287:18;29279:6;29276:30;29273:117;;;29309:79;;:::i;:::-;29273:117;29414:78;29484:7;29475:6;29464:9;29460:22;29414:78;:::i;:::-;29404:88;;29198:304;29569:3;29558:9;29554:19;29541:33;29601:18;29593:6;29590:30;29587:117;;;29623:79;;:::i;:::-;29587:117;29728:78;29798:7;29789:6;29778:9;29774:22;29728:78;:::i;:::-;29718:88;;29512:304;27696:2127;;;;;;;;:::o;29829:619::-;29906:6;29914;29922;29971:2;29959:9;29950:7;29946:23;29942:32;29939:119;;;29977:79;;:::i;:::-;29939:119;30097:1;30122:53;30167:7;30158:6;30147:9;30143:22;30122:53;:::i;:::-;30112:63;;30068:117;30224:2;30250:53;30295:7;30286:6;30275:9;30271:22;30250:53;:::i;:::-;30240:63;;30195:118;30352:2;30378:53;30423:7;30414:6;30403:9;30399:22;30378:53;:::i;:::-;30368:63;;30323:118;29829:619;;;;;:::o;30454:474::-;30522:6;30530;30579:2;30567:9;30558:7;30554:23;30550:32;30547:119;;;30585:79;;:::i;:::-;30547:119;30705:1;30730:53;30775:7;30766:6;30755:9;30751:22;30730:53;:::i;:::-;30720:63;;30676:117;30832:2;30858:53;30903:7;30894:6;30883:9;30879:22;30858:53;:::i;:::-;30848:63;;30803:118;30454:474;;;;;:::o;30934:1089::-;31038:6;31046;31054;31062;31070;31119:3;31107:9;31098:7;31094:23;31090:33;31087:120;;;31126:79;;:::i;:::-;31087:120;31246:1;31271:53;31316:7;31307:6;31296:9;31292:22;31271:53;:::i;:::-;31261:63;;31217:117;31373:2;31399:53;31444:7;31435:6;31424:9;31420:22;31399:53;:::i;:::-;31389:63;;31344:118;31501:2;31527:53;31572:7;31563:6;31552:9;31548:22;31527:53;:::i;:::-;31517:63;;31472:118;31629:2;31655:53;31700:7;31691:6;31680:9;31676:22;31655:53;:::i;:::-;31645:63;;31600:118;31785:3;31774:9;31770:19;31757:33;31817:18;31809:6;31806:30;31803:117;;;31839:79;;:::i;:::-;31803:117;31944:62;31998:7;31989:6;31978:9;31974:22;31944:62;:::i;:::-;31934:72;;31728:288;30934:1089;;;;;;;;:::o;32029:329::-;32088:6;32137:2;32125:9;32116:7;32112:23;32108:32;32105:119;;;32143:79;;:::i;:::-;32105:119;32263:1;32288:53;32333:7;32324:6;32313:9;32309:22;32288:53;:::i;:::-;32278:63;;32234:117;32029:329;;;;:::o;32364:230::-;32504:34;32500:1;32492:6;32488:14;32481:58;32573:13;32568:2;32560:6;32556:15;32549:38;32364:230;:::o;32600:366::-;32742:3;32763:67;32827:2;32822:3;32763:67;:::i;:::-;32756:74;;32839:93;32928:3;32839:93;:::i;:::-;32957:2;32952:3;32948:12;32941:19;;32600:366;;;:::o;32972:419::-;33138:4;33176:2;33165:9;33161:18;33153:26;;33225:9;33219:4;33215:20;33211:1;33200:9;33196:17;33189:47;33253:131;33379:4;33253:131;:::i;:::-;33245:139;;32972:419;;;:::o;33397:98::-;33448:6;33482:5;33476:12;33466:22;;33397:98;;;:::o;33501:168::-;33584:11;33618:6;33613:3;33606:19;33658:4;33653:3;33649:14;33634:29;;33501:168;;;;:::o;33675:360::-;33761:3;33789:38;33821:5;33789:38;:::i;:::-;33843:70;33906:6;33901:3;33843:70;:::i;:::-;33836:77;;33922:52;33967:6;33962:3;33955:4;33948:5;33944:16;33922:52;:::i;:::-;33999:29;34021:6;33999:29;:::i;:::-;33994:3;33990:39;33983:46;;33765:270;33675:360;;;;:::o;34041:751::-;34264:4;34302:3;34291:9;34287:19;34279:27;;34316:71;34384:1;34373:9;34369:17;34360:6;34316:71;:::i;:::-;34397:72;34465:2;34454:9;34450:18;34441:6;34397:72;:::i;:::-;34479;34547:2;34536:9;34532:18;34523:6;34479:72;:::i;:::-;34561;34629:2;34618:9;34614:18;34605:6;34561:72;:::i;:::-;34681:9;34675:4;34671:20;34665:3;34654:9;34650:19;34643:49;34709:76;34780:4;34771:6;34709:76;:::i;:::-;34701:84;;34041:751;;;;;;;;:::o;34798:141::-;34854:5;34885:6;34879:13;34870:22;;34901:32;34927:5;34901:32;:::i;:::-;34798:141;;;;:::o;34945:349::-;35014:6;35063:2;35051:9;35042:7;35038:23;35034:32;35031:119;;;35069:79;;:::i;:::-;35031:119;35189:1;35214:63;35269:7;35260:6;35249:9;35245:22;35214:63;:::i;:::-;35204:73;;35160:127;34945:349;;;;:::o;35300:106::-;35344:8;35393:5;35388:3;35384:15;35363:36;;35300:106;;;:::o;35412:183::-;35447:3;35485:1;35467:16;35464:23;35461:128;;;35523:1;35520;35517;35502:23;35545:34;35576:1;35570:8;35545:34;:::i;:::-;35538:41;;35461:128;35412:183;:::o;35601:711::-;35640:3;35678:4;35660:16;35657:26;35686:5;35654:39;35715:20;;:::i;:::-;35790:1;35772:16;35768:24;35765:1;35759:4;35744:49;35823:4;35817:11;35922:16;35915:4;35907:6;35903:17;35900:39;35867:18;35859:6;35856:30;35840:113;35837:146;;;35968:5;;;;35837:146;36014:6;36008:4;36004:17;36050:3;36044:10;36077:18;36069:6;36066:30;36063:43;;;36099:5;;;;;;36063:43;36147:6;36140:4;36135:3;36131:14;36127:27;36206:1;36188:16;36184:24;36178:4;36174:35;36169:3;36166:44;36163:57;;;36213:5;;;;;;;36163:57;36230;36278:6;36272:4;36268:17;36260:6;36256:30;36250:4;36230:57;:::i;:::-;36303:3;36296:10;;35644:668;;;;;35601:711;;:::o;36318:239::-;36458:34;36454:1;36446:6;36442:14;36435:58;36527:22;36522:2;36514:6;36510:15;36503:47;36318:239;:::o;36563:366::-;36705:3;36726:67;36790:2;36785:3;36726:67;:::i;:::-;36719:74;;36802:93;36891:3;36802:93;:::i;:::-;36920:2;36915:3;36911:12;36904:19;;36563:366;;;:::o;36935:419::-;37101:4;37139:2;37128:9;37124:18;37116:26;;37188:9;37182:4;37178:20;37174:1;37163:9;37159:17;37152:47;37216:131;37342:4;37216:131;:::i;:::-;37208:139;;36935:419;;;:::o;37360:227::-;37500:34;37496:1;37488:6;37484:14;37477:58;37569:10;37564:2;37556:6;37552:15;37545:35;37360:227;:::o;37593:366::-;37735:3;37756:67;37820:2;37815:3;37756:67;:::i;:::-;37749:74;;37832:93;37921:3;37832:93;:::i;:::-;37950:2;37945:3;37941:12;37934:19;;37593:366;;;:::o;37965:419::-;38131:4;38169:2;38158:9;38154:18;38146:26;;38218:9;38212:4;38208:20;38204:1;38193:9;38189:17;38182:47;38246:131;38372:4;38246:131;:::i;:::-;38238:139;;37965:419;;;:::o;38390:180::-;38438:77;38435:1;38428:88;38535:4;38532:1;38525:15;38559:4;38556:1;38549:15;38576:320;38620:6;38657:1;38651:4;38647:12;38637:22;;38704:1;38698:4;38694:12;38725:18;38715:81;;38781:4;38773:6;38769:17;38759:27;;38715:81;38843:2;38835:6;38832:14;38812:18;38809:38;38806:84;;38862:18;;:::i;:::-;38806:84;38627:269;38576:320;;;:::o;38902:148::-;39004:11;39041:3;39026:18;;38902:148;;;;:::o;39056:141::-;39105:4;39128:3;39120:11;;39151:3;39148:1;39141:14;39185:4;39182:1;39172:18;39164:26;;39056:141;;;:::o;39227:845::-;39330:3;39367:5;39361:12;39396:36;39422:9;39396:36;:::i;:::-;39448:89;39530:6;39525:3;39448:89;:::i;:::-;39441:96;;39568:1;39557:9;39553:17;39584:1;39579:137;;;;39730:1;39725:341;;;;39546:520;;39579:137;39663:4;39659:9;39648;39644:25;39639:3;39632:38;39699:6;39694:3;39690:16;39683:23;;39579:137;;39725:341;39792:38;39824:5;39792:38;:::i;:::-;39852:1;39866:154;39880:6;39877:1;39874:13;39866:154;;;39954:7;39948:14;39944:1;39939:3;39935:11;39928:35;40004:1;39995:7;39991:15;39980:26;;39902:4;39899:1;39895:12;39890:17;;39866:154;;;40049:6;40044:3;40040:16;40033:23;;39732:334;;39546:520;;39334:738;;39227:845;;;;:::o;40078:423::-;40252:3;40274:92;40362:3;40353:6;40274:92;:::i;:::-;40267:99;;40383:92;40471:3;40462:6;40383:92;:::i;:::-;40376:99;;40492:3;40485:10;;40078:423;;;;;:::o;40507:180::-;40555:77;40552:1;40545:88;40652:4;40649:1;40642:15;40676:4;40673:1;40666:15;40693:348;40733:7;40756:20;40774:1;40756:20;:::i;:::-;40751:25;;40790:20;40808:1;40790:20;:::i;:::-;40785:25;;40978:1;40910:66;40906:74;40903:1;40900:81;40895:1;40888:9;40881:17;40877:105;40874:131;;;40985:18;;:::i;:::-;40874:131;41033:1;41030;41026:9;41015:20;;40693:348;;;;:::o;41047:180::-;41095:77;41092:1;41085:88;41192:4;41189:1;41182:15;41216:4;41213:1;41206:15;41233:185;41273:1;41290:20;41308:1;41290:20;:::i;:::-;41285:25;;41324:20;41342:1;41324:20;:::i;:::-;41319:25;;41363:1;41353:35;;41368:18;;:::i;:::-;41353:35;41410:1;41407;41403:9;41398:14;;41233:185;;;;:::o;41424:228::-;41564:34;41560:1;41552:6;41548:14;41541:58;41633:11;41628:2;41620:6;41616:15;41609:36;41424:228;:::o;41658:366::-;41800:3;41821:67;41885:2;41880:3;41821:67;:::i;:::-;41814:74;;41897:93;41986:3;41897:93;:::i;:::-;42015:2;42010:3;42006:12;41999:19;;41658:366;;;:::o;42030:419::-;42196:4;42234:2;42223:9;42219:18;42211:26;;42283:9;42277:4;42273:20;42269:1;42258:9;42254:17;42247:47;42311:131;42437:4;42311:131;:::i;:::-;42303:139;;42030:419;;;:::o;42455:180::-;42503:77;42500:1;42493:88;42600:4;42597:1;42590:15;42624:4;42621:1;42614:15;42641:233;42680:3;42703:24;42721:5;42703:24;:::i;:::-;42694:33;;42749:66;42742:5;42739:77;42736:103;;42819:18;;:::i;:::-;42736:103;42866:1;42859:5;42855:13;42848:20;;42641:233;;;:::o;42880:181::-;43020:33;43016:1;43008:6;43004:14;42997:57;42880:181;:::o;43067:366::-;43209:3;43230:67;43294:2;43289:3;43230:67;:::i;:::-;43223:74;;43306:93;43395:3;43306:93;:::i;:::-;43424:2;43419:3;43415:12;43408:19;;43067:366;;;:::o;43439:419::-;43605:4;43643:2;43632:9;43628:18;43620:26;;43692:9;43686:4;43682:20;43678:1;43667:9;43663:17;43656:47;43720:131;43846:4;43720:131;:::i;:::-;43712:139;;43439:419;;;:::o;43864:305::-;43904:3;43923:20;43941:1;43923:20;:::i;:::-;43918:25;;43957:20;43975:1;43957:20;:::i;:::-;43952:25;;44111:1;44043:66;44039:74;44036:1;44033:81;44030:107;;;44117:18;;:::i;:::-;44030:107;44161:1;44158;44154:9;44147:16;;43864:305;;;;:::o;44175:174::-;44315:26;44311:1;44303:6;44299:14;44292:50;44175:174;:::o;44355:366::-;44497:3;44518:67;44582:2;44577:3;44518:67;:::i;:::-;44511:74;;44594:93;44683:3;44594:93;:::i;:::-;44712:2;44707:3;44703:12;44696:19;;44355:366;;;:::o;44727:419::-;44893:4;44931:2;44920:9;44916:18;44908:26;;44980:9;44974:4;44970:20;44966:1;44955:9;44951:17;44944:47;45008:131;45134:4;45008:131;:::i;:::-;45000:139;;44727:419;;;:::o;45152:85::-;45197:7;45226:5;45215:16;;45152:85;;;:::o;45243:158::-;45301:9;45334:61;45352:42;45361:32;45387:5;45361:32;:::i;:::-;45352:42;:::i;:::-;45334:61;:::i;:::-;45321:74;;45243:158;;;:::o;45407:147::-;45502:45;45541:5;45502:45;:::i;:::-;45497:3;45490:58;45407:147;;:::o;45560:348::-;45689:4;45727:2;45716:9;45712:18;45704:26;;45740:71;45808:1;45797:9;45793:17;45784:6;45740:71;:::i;:::-;45821:80;45897:2;45886:9;45882:18;45873:6;45821:80;:::i;:::-;45560:348;;;;;:::o;45914:225::-;46054:34;46050:1;46042:6;46038:14;46031:58;46123:8;46118:2;46110:6;46106:15;46099:33;45914:225;:::o;46145:366::-;46287:3;46308:67;46372:2;46367:3;46308:67;:::i;:::-;46301:74;;46384:93;46473:3;46384:93;:::i;:::-;46502:2;46497:3;46493:12;46486:19;;46145:366;;;:::o;46517:419::-;46683:4;46721:2;46710:9;46706:18;46698:26;;46770:9;46764:4;46760:20;46756:1;46745:9;46741:17;46734:47;46798:131;46924:4;46798:131;:::i;:::-;46790:139;;46517:419;;;:::o;46942:182::-;47082:34;47078:1;47070:6;47066:14;47059:58;46942:182;:::o;47130:366::-;47272:3;47293:67;47357:2;47352:3;47293:67;:::i;:::-;47286:74;;47369:93;47458:3;47369:93;:::i;:::-;47487:2;47482:3;47478:12;47471:19;;47130:366;;;:::o;47502:419::-;47668:4;47706:2;47695:9;47691:18;47683:26;;47755:9;47749:4;47745:20;47741:1;47730:9;47726:17;47719:47;47783:131;47909:4;47783:131;:::i;:::-;47775:139;;47502:419;;;:::o;47927:332::-;48048:4;48086:2;48075:9;48071:18;48063:26;;48099:71;48167:1;48156:9;48152:17;48143:6;48099:71;:::i;:::-;48180:72;48248:2;48237:9;48233:18;48224:6;48180:72;:::i;:::-;47927:332;;;;;:::o;48265:137::-;48319:5;48350:6;48344:13;48335:22;;48366:30;48390:5;48366:30;:::i;:::-;48265:137;;;;:::o;48408:345::-;48475:6;48524:2;48512:9;48503:7;48499:23;48495:32;48492:119;;;48530:79;;:::i;:::-;48492:119;48650:1;48675:61;48728:7;48719:6;48708:9;48704:22;48675:61;:::i;:::-;48665:71;;48621:125;48408:345;;;;:::o;48759:237::-;48899:34;48895:1;48887:6;48883:14;48876:58;48968:20;48963:2;48955:6;48951:15;48944:45;48759:237;:::o;49002:366::-;49144:3;49165:67;49229:2;49224:3;49165:67;:::i;:::-;49158:74;;49241:93;49330:3;49241:93;:::i;:::-;49359:2;49354:3;49350:12;49343:19;;49002:366;;;:::o;49374:419::-;49540:4;49578:2;49567:9;49563:18;49555:26;;49627:9;49621:4;49617:20;49613:1;49602:9;49598:17;49591:47;49655:131;49781:4;49655:131;:::i;:::-;49647:139;;49374:419;;;:::o;49799:220::-;49939:34;49935:1;49927:6;49923:14;49916:58;50008:3;50003:2;49995:6;49991:15;49984:28;49799:220;:::o;50025:366::-;50167:3;50188:67;50252:2;50247:3;50188:67;:::i;:::-;50181:74;;50264:93;50353:3;50264:93;:::i;:::-;50382:2;50377:3;50373:12;50366:19;;50025:366;;;:::o;50397:419::-;50563:4;50601:2;50590:9;50586:18;50578:26;;50650:9;50644:4;50640:20;50636:1;50625:9;50621:17;50614:47;50678:131;50804:4;50678:131;:::i;:::-;50670:139;;50397:419;;;:::o;50822:227::-;50962:34;50958:1;50950:6;50946:14;50939:58;51031:10;51026:2;51018:6;51014:15;51007:35;50822:227;:::o;51055:366::-;51197:3;51218:67;51282:2;51277:3;51218:67;:::i;:::-;51211:74;;51294:93;51383:3;51294:93;:::i;:::-;51412:2;51407:3;51403:12;51396:19;;51055:366;;;:::o;51427:419::-;51593:4;51631:2;51620:9;51616:18;51608:26;;51680:9;51674:4;51670:20;51666:1;51655:9;51651:17;51644:47;51708:131;51834:4;51708:131;:::i;:::-;51700:139;;51427:419;;;:::o;51852:332::-;51973:4;52011:2;52000:9;51996:18;51988:26;;52024:71;52092:1;52081:9;52077:17;52068:6;52024:71;:::i;:::-;52105:72;52173:2;52162:9;52158:18;52149:6;52105:72;:::i;:::-;51852:332;;;;;:::o;52190:176::-;52330:28;52326:1;52318:6;52314:14;52307:52;52190:176;:::o;52372:366::-;52514:3;52535:67;52599:2;52594:3;52535:67;:::i;:::-;52528:74;;52611:93;52700:3;52611:93;:::i;:::-;52729:2;52724:3;52720:12;52713:19;;52372:366;;;:::o;52744:419::-;52910:4;52948:2;52937:9;52933:18;52925:26;;52997:9;52991:4;52987:20;52983:1;52972:9;52968:17;52961:47;53025:131;53151:4;53025:131;:::i;:::-;53017:139;;52744:419;;;:::o;53169:228::-;53309:34;53305:1;53297:6;53293:14;53286:58;53378:11;53373:2;53365:6;53361:15;53354:36;53169:228;:::o;53403:366::-;53545:3;53566:67;53630:2;53625:3;53566:67;:::i;:::-;53559:74;;53642:93;53731:3;53642:93;:::i;:::-;53760:2;53755:3;53751:12;53744:19;;53403:366;;;:::o;53775:419::-;53941:4;53979:2;53968:9;53964:18;53956:26;;54028:9;54022:4;54018:20;54014:1;54003:9;53999:17;53992:47;54056:131;54182:4;54056:131;:::i;:::-;54048:139;;53775:419;;;:::o;54200:224::-;54340:34;54336:1;54328:6;54324:14;54317:58;54409:7;54404:2;54396:6;54392:15;54385:32;54200:224;:::o;54430:366::-;54572:3;54593:67;54657:2;54652:3;54593:67;:::i;:::-;54586:74;;54669:93;54758:3;54669:93;:::i;:::-;54787:2;54782:3;54778:12;54771:19;;54430:366;;;:::o;54802:419::-;54968:4;55006:2;54995:9;54991:18;54983:26;;55055:9;55049:4;55045:20;55041:1;55030:9;55026:17;55019:47;55083:131;55209:4;55083:131;:::i;:::-;55075:139;;54802:419;;;:::o;55227:229::-;55367:34;55363:1;55355:6;55351:14;55344:58;55436:12;55431:2;55423:6;55419:15;55412:37;55227:229;:::o;55462:366::-;55604:3;55625:67;55689:2;55684:3;55625:67;:::i;:::-;55618:74;;55701:93;55790:3;55701:93;:::i;:::-;55819:2;55814:3;55810:12;55803:19;;55462:366;;;:::o;55834:419::-;56000:4;56038:2;56027:9;56023:18;56015:26;;56087:9;56081:4;56077:20;56073:1;56062:9;56058:17;56051:47;56115:131;56241:4;56115:131;:::i;:::-;56107:139;;55834:419;;;:::o;56259:634::-;56480:4;56518:2;56507:9;56503:18;56495:26;;56567:9;56561:4;56557:20;56553:1;56542:9;56538:17;56531:47;56595:108;56698:4;56689:6;56595:108;:::i;:::-;56587:116;;56750:9;56744:4;56740:20;56735:2;56724:9;56720:18;56713:48;56778:108;56881:4;56872:6;56778:108;:::i;:::-;56770:116;;56259:634;;;;;:::o;56899:1053::-;57222:4;57260:3;57249:9;57245:19;57237:27;;57274:71;57342:1;57331:9;57327:17;57318:6;57274:71;:::i;:::-;57355:72;57423:2;57412:9;57408:18;57399:6;57355:72;:::i;:::-;57474:9;57468:4;57464:20;57459:2;57448:9;57444:18;57437:48;57502:108;57605:4;57596:6;57502:108;:::i;:::-;57494:116;;57657:9;57651:4;57647:20;57642:2;57631:9;57627:18;57620:48;57685:108;57788:4;57779:6;57685:108;:::i;:::-;57677:116;;57841:9;57835:4;57831:20;57825:3;57814:9;57810:19;57803:49;57869:76;57940:4;57931:6;57869:76;:::i;:::-;57861:84;;56899:1053;;;;;;;;:::o;57958:228::-;58098:34;58094:1;58086:6;58082:14;58075:58;58167:11;58162:2;58154:6;58150:15;58143:36;57958:228;:::o;58192:366::-;58334:3;58355:67;58419:2;58414:3;58355:67;:::i;:::-;58348:74;;58431:93;58520:3;58431:93;:::i;:::-;58549:2;58544:3;58540:12;58533:19;;58192:366;;;:::o;58564:419::-;58730:4;58768:2;58757:9;58753:18;58745:26;;58817:9;58811:4;58807:20;58803:1;58792:9;58788:17;58781:47;58845:131;58971:4;58845:131;:::i;:::-;58837:139;;58564:419;;;:::o
Swarm Source
ipfs://17547a6a2e11df43332e1e3da50153982c6e502f205cbb86ceb8c5808a60c500
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.