Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 500 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 20655743 | 140 days ago | IN | 0 ETH | 0.00002904 | ||||
Mint | 20574808 | 151 days ago | IN | 0 ETH | 0.00006276 | ||||
Set Approval For... | 18519112 | 439 days ago | IN | 0 ETH | 0.00099906 | ||||
Set Approval For... | 18099306 | 498 days ago | IN | 0 ETH | 0.00025748 | ||||
Set Approval For... | 17948102 | 519 days ago | IN | 0 ETH | 0.0006167 | ||||
Set Approval For... | 17902908 | 525 days ago | IN | 0 ETH | 0.00058658 | ||||
Mint | 17854761 | 532 days ago | IN | 0 ETH | 0.00142697 | ||||
Set Approval For... | 17790828 | 541 days ago | IN | 0 ETH | 0.00111598 | ||||
Set Approval For... | 17740152 | 548 days ago | IN | 0 ETH | 0.00105105 | ||||
Mint | 17599001 | 568 days ago | IN | 0 ETH | 0.00139887 | ||||
Set Approval For... | 17557349 | 574 days ago | IN | 0 ETH | 0.00059356 | ||||
Set Approval For... | 17514197 | 580 days ago | IN | 0 ETH | 0.00081304 | ||||
Mint | 17431280 | 592 days ago | IN | 0 ETH | 0.00223588 | ||||
Set Approval For... | 17378029 | 599 days ago | IN | 0 ETH | 0.00141107 | ||||
Mint | 17352544 | 603 days ago | IN | 0 ETH | 0.00262921 | ||||
Transfer Out | 17346529 | 603 days ago | IN | 0 ETH | 0.0007993 | ||||
Set Approval For... | 17344643 | 604 days ago | IN | 0 ETH | 0.00156283 | ||||
Set Approval For... | 17344643 | 604 days ago | IN | 0 ETH | 0.00156565 | ||||
Set Approval For... | 17344635 | 604 days ago | IN | 0 ETH | 0.00150346 | ||||
Set Approval For... | 17344634 | 604 days ago | IN | 0 ETH | 0.00153912 | ||||
Set Approval For... | 17344620 | 604 days ago | IN | 0 ETH | 0.00162758 | ||||
Set Approval For... | 17344620 | 604 days ago | IN | 0 ETH | 0.00162465 | ||||
Set Approval For... | 17344608 | 604 days ago | IN | 0 ETH | 0.00139902 | ||||
Set Approval For... | 17344607 | 604 days ago | IN | 0 ETH | 0.00145672 | ||||
Set Approval For... | 17344588 | 604 days ago | IN | 0 ETH | 0.00150008 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
17346529 | 603 days ago | 0.06 ETH |
Loading...
Loading
Contract Name:
VGiftBox
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-05-22 */ // SPDX-License-Identifier: MIT // File: contracts/gift/IOperatorFilterRegistry.sol pragma solidity ^0.8.0; 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); } // File: contracts/gift/OperatorFilterer.sol pragma solidity ^0.8.0; /** * @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); } } } } // File: contracts/gift/DefaultOperatorFilterer.sol pragma solidity ^0.8.0; /** * @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) {} } // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external payable; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) public payable virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/interfaces/IERC2981.sol // OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // File: @openzeppelin/contracts/token/common/ERC2981.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: contracts/gift/VBox.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; contract VGiftBox is ERC721A, ERC2981, Ownable, DefaultOperatorFilterer { using SafeMath for uint256; using SafeMath for uint96; uint256 public constant MAX_SUPPLY = 20000; uint256 public constant FREE_SUPPLY = 3; uint256 public constant PAID_SUPPLY = 10; string private _baseTokenURI = "https://ipfs.io/ipfs/bafybeigrcws7nosbos3cbxn5pbuc525gprkwf3a4gzsiuxlsegswofrp4m/box/"; mapping(address => bool) private _hasMinted; event NewMint(address indexed msgSender, uint256 indexed mintQuantity); constructor() ERC721A("VGiftBox", "VGB") { _setDefaultRoyalty(msg.sender, 500); } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A, ERC2981) returns (bool) { return super.supportsInterface(interfaceId); } function _startTokenId() internal view override virtual returns (uint256) { return 1; } function transferOut(address _to) public onlyOwner { uint256 balance = address(this).balance; payable(_to).transfer(balance); } function changeURI(string calldata _tokenURI) external onlyOwner { _baseTokenURI = _tokenURI; } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function tokenURI(uint256 tokenId) public view override returns (string memory) { require( _exists(tokenId),"ERC721Metadata: URI query for nonexistent token"); return string(abi.encodePacked(_baseTokenURI,Strings.toString(tokenId))); } function mint(uint256 quantity) public payable { require(totalSupply() + quantity <= MAX_SUPPLY, "ERC721: Exceeds maximum supply"); require(quantity == 1 || quantity == FREE_SUPPLY || quantity == PAID_SUPPLY, "ERC721: Invalid quantity"); require(!_hasMinted[msg.sender], "ERC721: Already minted"); if (quantity <= FREE_SUPPLY) { _safeMint(msg.sender,quantity); } else { require(msg.value == 0.01 ether, "ERC721: Insufficient payment"); _safeMint(msg.sender,quantity); } _hasMinted[msg.sender] = true; emit NewMint(msg.sender, quantity); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"msgSender","type":"address"},{"indexed":true,"internalType":"uint256","name":"mintQuantity","type":"uint256"}],"name":"NewMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"FREE_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAID_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"changeURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","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":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"transferOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260405180608001604052806055815260200162003bcb60559139600b90816200002e91906200082b565b503480156200003c57600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600881526020017f5647696674426f780000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f56474200000000000000000000000000000000000000000000000000000000008152508160029081620000d191906200082b565b508060039081620000e391906200082b565b50620000f46200032d60201b60201c565b60008190555050506200011c620001106200033660201b60201c565b6200033e60201b60201c565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111562000311578015620001d7576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200019d92919062000957565b600060405180830381600087803b158015620001b857600080fd5b505af1158015620001cd573d6000803e3d6000fd5b5050505062000310565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000291576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200025792919062000957565b600060405180830381600087803b1580156200027257600080fd5b505af115801562000287573d6000803e3d6000fd5b505050506200030f565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620002da919062000984565b600060405180830381600087803b158015620002f557600080fd5b505af11580156200030a573d6000803e3d6000fd5b505050505b5b5b505062000327336101f46200040460201b60201c565b62000abc565b60006001905090565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b62000414620005a760201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111562000475576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200046c9062000a28565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620004e7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004de9062000a9a565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000612710905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200063357607f821691505b602082108103620006495762000648620005eb565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620006b37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000674565b620006bf868362000674565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200070c620007066200070084620006d7565b620006e1565b620006d7565b9050919050565b6000819050919050565b6200072883620006eb565b62000740620007378262000713565b84845462000681565b825550505050565b600090565b6200075762000748565b620007648184846200071d565b505050565b5b818110156200078c57620007806000826200074d565b6001810190506200076a565b5050565b601f821115620007db57620007a5816200064f565b620007b08462000664565b81016020851015620007c0578190505b620007d8620007cf8562000664565b83018262000769565b50505b505050565b600082821c905092915050565b60006200080060001984600802620007e0565b1980831691505092915050565b60006200081b8383620007ed565b9150826002028217905092915050565b6200083682620005b1565b67ffffffffffffffff811115620008525762000851620005bc565b5b6200085e82546200061a565b6200086b82828562000790565b600060209050601f831160018114620008a357600084156200088e578287015190505b6200089a85826200080d565b8655506200090a565b601f198416620008b3866200064f565b60005b82811015620008dd57848901518255600182019150602085019450602081019050620008b6565b86831015620008fd5784890151620008f9601f891682620007ed565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200093f8262000912565b9050919050565b620009518162000932565b82525050565b60006040820190506200096e600083018562000946565b6200097d602083018462000946565b9392505050565b60006020820190506200099b600083018462000946565b92915050565b600082825260208201905092915050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600062000a10602a83620009a1565b915062000a1d82620009b2565b604082019050919050565b6000602082019050818103600083015262000a438162000a01565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600062000a82601983620009a1565b915062000a8f8262000a4a565b602082019050919050565b6000602082019050818103600083015262000ab58162000a73565b9050919050565b6130ff8062000acc6000396000f3fe6080604052600436106101665760003560e01c8063715018a6116100d1578063a22cb4651161008a578063e5e01c1111610064578063e5e01c11146104fc578063e985e9c514610525578063f2fde38b14610562578063fe878b1d1461058b57610166565b8063a22cb4651461047a578063b88d4fde146104a3578063c87b56dd146104bf57610166565b8063715018a61461039d5780638da5cb5b146103b457806395d89b41146103df5780639858cf191461040a5780639894ba7c14610435578063a0712d681461045e57610166565b80632a55205a116101235780632a55205a1461027357806332cb6b0c146102b157806341f43434146102dc57806342842e0e146103075780636352211e1461032357806370a082311461036057610166565b806301ffc9a71461016b57806306fdde03146101a8578063081812fc146101d3578063095ea7b31461021057806318160ddd1461022c57806323b872dd14610257575b600080fd5b34801561017757600080fd5b50610192600480360381019061018d9190612027565b6105b6565b60405161019f919061206f565b60405180910390f35b3480156101b457600080fd5b506101bd6105c8565b6040516101ca919061211a565b60405180910390f35b3480156101df57600080fd5b506101fa60048036038101906101f59190612172565b61065a565b60405161020791906121e0565b60405180910390f35b61022a60048036038101906102259190612227565b6106d9565b005b34801561023857600080fd5b5061024161081d565b60405161024e9190612276565b60405180910390f35b610271600480360381019061026c9190612291565b610834565b005b34801561027f57600080fd5b5061029a600480360381019061029591906122e4565b610b56565b6040516102a8929190612324565b60405180910390f35b3480156102bd57600080fd5b506102c6610d40565b6040516102d39190612276565b60405180910390f35b3480156102e857600080fd5b506102f1610d46565b6040516102fe91906123ac565b60405180910390f35b610321600480360381019061031c9190612291565b610d58565b005b34801561032f57600080fd5b5061034a60048036038101906103459190612172565b610d78565b60405161035791906121e0565b60405180910390f35b34801561036c57600080fd5b50610387600480360381019061038291906123c7565b610d8a565b6040516103949190612276565b60405180910390f35b3480156103a957600080fd5b506103b2610e42565b005b3480156103c057600080fd5b506103c9610eca565b6040516103d691906121e0565b60405180910390f35b3480156103eb57600080fd5b506103f4610ef4565b604051610401919061211a565b60405180910390f35b34801561041657600080fd5b5061041f610f86565b60405161042c9190612276565b60405180910390f35b34801561044157600080fd5b5061045c600480360381019061045791906123c7565b610f8b565b005b61047860048036038101906104739190612172565b611057565b005b34801561048657600080fd5b506104a1600480360381019061049c9190612420565b61129e565b005b6104bd60048036038101906104b89190612595565b6113a9565b005b3480156104cb57600080fd5b506104e660048036038101906104e19190612172565b61141c565b6040516104f3919061211a565b60405180910390f35b34801561050857600080fd5b50610523600480360381019061051e9190612678565b611498565b005b34801561053157600080fd5b5061054c600480360381019061054791906126c5565b61152a565b604051610559919061206f565b60405180910390f35b34801561056e57600080fd5b50610589600480360381019061058491906123c7565b6115be565b005b34801561059757600080fd5b506105a06116b5565b6040516105ad9190612276565b60405180910390f35b60006105c1826116ba565b9050919050565b6060600280546105d790612734565b80601f016020809104026020016040519081016040528092919081815260200182805461060390612734565b80156106505780601f1061062557610100808354040283529160200191610650565b820191906000526020600020905b81548152906001019060200180831161063357829003601f168201915b5050505050905090565b600061066582611734565b61069b576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106e482610d78565b90508073ffffffffffffffffffffffffffffffffffffffff16610705611793565b73ffffffffffffffffffffffffffffffffffffffff1614610768576107318161072c611793565b61152a565b610767576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061082761179b565b6001546000540303905090565b600061083f826117a4565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146108a6576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806108b284611870565b915091506108c881876108c3611793565b611897565b610914576108dd866108d8611793565b61152a565b610913576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361097a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61098786868660016118db565b801561099257600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610a6085610a3c8888876118e1565b7c020000000000000000000000000000000000000000000000000000000017611909565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610ae65760006001850190506000600460008381526020019081526020016000205403610ae4576000548114610ae3578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610b4e8686866001611934565b505050505050565b6000806000600960008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610ceb5760086040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610cf561193a565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610d219190612794565b610d2b9190612805565b90508160000151819350935050509250929050565b614e2081565b6daaeb6d7670e522a718067333cd4e81565b610d73838383604051806020016040528060008152506113a9565b505050565b6000610d83826117a4565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610df1576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610e4a611944565b73ffffffffffffffffffffffffffffffffffffffff16610e68610eca565b73ffffffffffffffffffffffffffffffffffffffff1614610ebe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb590612882565b60405180910390fd5b610ec8600061194c565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610f0390612734565b80601f0160208091040260200160405190810160405280929190818152602001828054610f2f90612734565b8015610f7c5780601f10610f5157610100808354040283529160200191610f7c565b820191906000526020600020905b815481529060010190602001808311610f5f57829003601f168201915b5050505050905090565b600381565b610f93611944565b73ffffffffffffffffffffffffffffffffffffffff16610fb1610eca565b73ffffffffffffffffffffffffffffffffffffffff1614611007576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffe90612882565b60405180910390fd5b60004790508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611052573d6000803e3d6000fd5b505050565b614e208161106361081d565b61106d91906128a2565b11156110ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a590612922565b60405180910390fd5b60018114806110bd5750600381145b806110c85750600a81145b611107576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fe9061298e565b60405180910390fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118b906129fa565b60405180910390fd5b600381116111ab576111a63382611a12565b6111ff565b662386f26fc1000034146111f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111eb90612a66565b60405180910390fd5b6111fe3382611a12565b5b6001600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550803373ffffffffffffffffffffffffffffffffffffffff167f52277f0b4a9b555c5aa96900a13546f972bda413737ec164aac947c87eec602460405160405180910390a350565b80600760006112ab611793565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611358611793565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161139d919061206f565b60405180910390a35050565b6113b4848484610834565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611416576113df84848484611a30565b611415576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061142782611734565b611466576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145d90612af8565b60405180910390fd5b600b61147183611b80565b604051602001611482929190612bec565b6040516020818303038152906040529050919050565b6114a0611944565b73ffffffffffffffffffffffffffffffffffffffff166114be610eca565b73ffffffffffffffffffffffffffffffffffffffff1614611514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150b90612882565b60405180910390fd5b8181600b9182611525929190612da8565b505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115c6611944565b73ffffffffffffffffffffffffffffffffffffffff166115e4610eca565b73ffffffffffffffffffffffffffffffffffffffff161461163a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163190612882565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036116a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a090612eea565b60405180910390fd5b6116b28161194c565b50565b600a81565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061172d575061172c82611ce0565b5b9050919050565b60008161173f61179b565b1115801561174e575060005482105b801561178c575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b600080829050806117b361179b565b11611839576000548110156118385760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611836575b6000810361182c576004600083600190039350838152602001908152602001600020549050611802565b809250505061186b565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86118f8868684611d4a565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000612710905090565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611a2c828260405180602001604052806000815250611d53565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611a56611793565b8786866040518563ffffffff1660e01b8152600401611a789493929190612f5f565b6020604051808303816000875af1925050508015611ab457506040513d601f19601f82011682018060405250810190611ab19190612fc0565b60015b611b2d573d8060008114611ae4576040519150601f19603f3d011682016040523d82523d6000602084013e611ae9565b606091505b506000815103611b25576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060008203611bc7576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611cdb565b600082905060005b60008214611bf9578080611be290612fed565b915050600a82611bf29190612805565b9150611bcf565b60008167ffffffffffffffff811115611c1557611c1461246a565b5b6040519080825280601f01601f191660200182016040528015611c475781602001600182028036833780820191505090505b5090505b60008514611cd457600182611c609190613035565b9150600a85611c6f9190613069565b6030611c7b91906128a2565b60f81b818381518110611c9157611c9061309a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611ccd9190612805565b9450611c4b565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60009392505050565b611d5d8383611df0565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611deb57600080549050600083820390505b611d9d6000868380600101945086611a30565b611dd3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611d8a578160005414611de857600080fd5b50505b505050565b60008054905060008203611e30576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611e3d60008483856118db565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611eb483611ea560008660006118e1565b611eae85611fab565b17611909565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114611f5557808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611f1a565b5060008203611f90576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050611fa66000848385611934565b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61200481611fcf565b811461200f57600080fd5b50565b60008135905061202181611ffb565b92915050565b60006020828403121561203d5761203c611fc5565b5b600061204b84828501612012565b91505092915050565b60008115159050919050565b61206981612054565b82525050565b60006020820190506120846000830184612060565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156120c45780820151818401526020810190506120a9565b60008484015250505050565b6000601f19601f8301169050919050565b60006120ec8261208a565b6120f68185612095565b93506121068185602086016120a6565b61210f816120d0565b840191505092915050565b6000602082019050818103600083015261213481846120e1565b905092915050565b6000819050919050565b61214f8161213c565b811461215a57600080fd5b50565b60008135905061216c81612146565b92915050565b60006020828403121561218857612187611fc5565b5b60006121968482850161215d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006121ca8261219f565b9050919050565b6121da816121bf565b82525050565b60006020820190506121f560008301846121d1565b92915050565b612204816121bf565b811461220f57600080fd5b50565b600081359050612221816121fb565b92915050565b6000806040838503121561223e5761223d611fc5565b5b600061224c85828601612212565b925050602061225d8582860161215d565b9150509250929050565b6122708161213c565b82525050565b600060208201905061228b6000830184612267565b92915050565b6000806000606084860312156122aa576122a9611fc5565b5b60006122b886828701612212565b93505060206122c986828701612212565b92505060406122da8682870161215d565b9150509250925092565b600080604083850312156122fb576122fa611fc5565b5b60006123098582860161215d565b925050602061231a8582860161215d565b9150509250929050565b600060408201905061233960008301856121d1565b6123466020830184612267565b9392505050565b6000819050919050565b600061237261236d6123688461219f565b61234d565b61219f565b9050919050565b600061238482612357565b9050919050565b600061239682612379565b9050919050565b6123a68161238b565b82525050565b60006020820190506123c1600083018461239d565b92915050565b6000602082840312156123dd576123dc611fc5565b5b60006123eb84828501612212565b91505092915050565b6123fd81612054565b811461240857600080fd5b50565b60008135905061241a816123f4565b92915050565b6000806040838503121561243757612436611fc5565b5b600061244585828601612212565b92505060206124568582860161240b565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6124a2826120d0565b810181811067ffffffffffffffff821117156124c1576124c061246a565b5b80604052505050565b60006124d4611fbb565b90506124e08282612499565b919050565b600067ffffffffffffffff821115612500576124ff61246a565b5b612509826120d0565b9050602081019050919050565b82818337600083830152505050565b6000612538612533846124e5565b6124ca565b90508281526020810184848401111561255457612553612465565b5b61255f848285612516565b509392505050565b600082601f83011261257c5761257b612460565b5b813561258c848260208601612525565b91505092915050565b600080600080608085870312156125af576125ae611fc5565b5b60006125bd87828801612212565b94505060206125ce87828801612212565b93505060406125df8782880161215d565b925050606085013567ffffffffffffffff811115612600576125ff611fca565b5b61260c87828801612567565b91505092959194509250565b600080fd5b600080fd5b60008083601f84011261263857612637612460565b5b8235905067ffffffffffffffff81111561265557612654612618565b5b6020830191508360018202830111156126715761267061261d565b5b9250929050565b6000806020838503121561268f5761268e611fc5565b5b600083013567ffffffffffffffff8111156126ad576126ac611fca565b5b6126b985828601612622565b92509250509250929050565b600080604083850312156126dc576126db611fc5565b5b60006126ea85828601612212565b92505060206126fb85828601612212565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061274c57607f821691505b60208210810361275f5761275e612705565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061279f8261213c565b91506127aa8361213c565b92508282026127b88161213c565b915082820484148315176127cf576127ce612765565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006128108261213c565b915061281b8361213c565b92508261282b5761282a6127d6565b5b828204905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061286c602083612095565b915061287782612836565b602082019050919050565b6000602082019050818103600083015261289b8161285f565b9050919050565b60006128ad8261213c565b91506128b88361213c565b92508282019050808211156128d0576128cf612765565b5b92915050565b7f4552433732313a2045786365656473206d6178696d756d20737570706c790000600082015250565b600061290c601e83612095565b9150612917826128d6565b602082019050919050565b6000602082019050818103600083015261293b816128ff565b9050919050565b7f4552433732313a20496e76616c6964207175616e746974790000000000000000600082015250565b6000612978601883612095565b915061298382612942565b602082019050919050565b600060208201905081810360008301526129a78161296b565b9050919050565b7f4552433732313a20416c7265616479206d696e74656400000000000000000000600082015250565b60006129e4601683612095565b91506129ef826129ae565b602082019050919050565b60006020820190508181036000830152612a13816129d7565b9050919050565b7f4552433732313a20496e73756666696369656e74207061796d656e7400000000600082015250565b6000612a50601c83612095565b9150612a5b82612a1a565b602082019050919050565b60006020820190508181036000830152612a7f81612a43565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000612ae2602f83612095565b9150612aed82612a86565b604082019050919050565b60006020820190508181036000830152612b1181612ad5565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154612b4581612734565b612b4f8186612b18565b94506001821660008114612b6a5760018114612b7f57612bb2565b60ff1983168652811515820286019350612bb2565b612b8885612b23565b60005b83811015612baa57815481890152600182019150602081019050612b8b565b838801955050505b50505092915050565b6000612bc68261208a565b612bd08185612b18565b9350612be08185602086016120a6565b80840191505092915050565b6000612bf88285612b38565b9150612c048284612bbb565b91508190509392505050565b600082905092915050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612c687fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612c2b565b612c728683612c2b565b95508019841693508086168417925050509392505050565b6000612ca5612ca0612c9b8461213c565b61234d565b61213c565b9050919050565b6000819050919050565b612cbf83612c8a565b612cd3612ccb82612cac565b848454612c38565b825550505050565b600090565b612ce8612cdb565b612cf3818484612cb6565b505050565b5b81811015612d1757612d0c600082612ce0565b600181019050612cf9565b5050565b601f821115612d5c57612d2d81612b23565b612d3684612c1b565b81016020851015612d45578190505b612d59612d5185612c1b565b830182612cf8565b50505b505050565b600082821c905092915050565b6000612d7f60001984600802612d61565b1980831691505092915050565b6000612d988383612d6e565b9150826002028217905092915050565b612db28383612c10565b67ffffffffffffffff811115612dcb57612dca61246a565b5b612dd58254612734565b612de0828285612d1b565b6000601f831160018114612e0f5760008415612dfd578287013590505b612e078582612d8c565b865550612e6f565b601f198416612e1d86612b23565b60005b82811015612e4557848901358255600182019150602085019450602081019050612e20565b86831015612e625784890135612e5e601f891682612d6e565b8355505b6001600288020188555050505b50505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612ed4602683612095565b9150612edf82612e78565b604082019050919050565b60006020820190508181036000830152612f0381612ec7565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000612f3182612f0a565b612f3b8185612f15565b9350612f4b8185602086016120a6565b612f54816120d0565b840191505092915050565b6000608082019050612f7460008301876121d1565b612f8160208301866121d1565b612f8e6040830185612267565b8181036060830152612fa08184612f26565b905095945050505050565b600081519050612fba81611ffb565b92915050565b600060208284031215612fd657612fd5611fc5565b5b6000612fe484828501612fab565b91505092915050565b6000612ff88261213c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361302a57613029612765565b5b600182019050919050565b60006130408261213c565b915061304b8361213c565b925082820390508181111561306357613062612765565b5b92915050565b60006130748261213c565b915061307f8361213c565b92508261308f5761308e6127d6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220313b34f16836f2af15abc42b515f6d67aff3581949da64081b65ca550002d93164736f6c6343000812003368747470733a2f2f697066732e696f2f697066732f626166796265696772637773376e6f73626f73336362786e35706275633532356770726b7766336134677a736975786c73656773776f667270346d2f626f782f
Deployed Bytecode
0x6080604052600436106101665760003560e01c8063715018a6116100d1578063a22cb4651161008a578063e5e01c1111610064578063e5e01c11146104fc578063e985e9c514610525578063f2fde38b14610562578063fe878b1d1461058b57610166565b8063a22cb4651461047a578063b88d4fde146104a3578063c87b56dd146104bf57610166565b8063715018a61461039d5780638da5cb5b146103b457806395d89b41146103df5780639858cf191461040a5780639894ba7c14610435578063a0712d681461045e57610166565b80632a55205a116101235780632a55205a1461027357806332cb6b0c146102b157806341f43434146102dc57806342842e0e146103075780636352211e1461032357806370a082311461036057610166565b806301ffc9a71461016b57806306fdde03146101a8578063081812fc146101d3578063095ea7b31461021057806318160ddd1461022c57806323b872dd14610257575b600080fd5b34801561017757600080fd5b50610192600480360381019061018d9190612027565b6105b6565b60405161019f919061206f565b60405180910390f35b3480156101b457600080fd5b506101bd6105c8565b6040516101ca919061211a565b60405180910390f35b3480156101df57600080fd5b506101fa60048036038101906101f59190612172565b61065a565b60405161020791906121e0565b60405180910390f35b61022a60048036038101906102259190612227565b6106d9565b005b34801561023857600080fd5b5061024161081d565b60405161024e9190612276565b60405180910390f35b610271600480360381019061026c9190612291565b610834565b005b34801561027f57600080fd5b5061029a600480360381019061029591906122e4565b610b56565b6040516102a8929190612324565b60405180910390f35b3480156102bd57600080fd5b506102c6610d40565b6040516102d39190612276565b60405180910390f35b3480156102e857600080fd5b506102f1610d46565b6040516102fe91906123ac565b60405180910390f35b610321600480360381019061031c9190612291565b610d58565b005b34801561032f57600080fd5b5061034a60048036038101906103459190612172565b610d78565b60405161035791906121e0565b60405180910390f35b34801561036c57600080fd5b50610387600480360381019061038291906123c7565b610d8a565b6040516103949190612276565b60405180910390f35b3480156103a957600080fd5b506103b2610e42565b005b3480156103c057600080fd5b506103c9610eca565b6040516103d691906121e0565b60405180910390f35b3480156103eb57600080fd5b506103f4610ef4565b604051610401919061211a565b60405180910390f35b34801561041657600080fd5b5061041f610f86565b60405161042c9190612276565b60405180910390f35b34801561044157600080fd5b5061045c600480360381019061045791906123c7565b610f8b565b005b61047860048036038101906104739190612172565b611057565b005b34801561048657600080fd5b506104a1600480360381019061049c9190612420565b61129e565b005b6104bd60048036038101906104b89190612595565b6113a9565b005b3480156104cb57600080fd5b506104e660048036038101906104e19190612172565b61141c565b6040516104f3919061211a565b60405180910390f35b34801561050857600080fd5b50610523600480360381019061051e9190612678565b611498565b005b34801561053157600080fd5b5061054c600480360381019061054791906126c5565b61152a565b604051610559919061206f565b60405180910390f35b34801561056e57600080fd5b50610589600480360381019061058491906123c7565b6115be565b005b34801561059757600080fd5b506105a06116b5565b6040516105ad9190612276565b60405180910390f35b60006105c1826116ba565b9050919050565b6060600280546105d790612734565b80601f016020809104026020016040519081016040528092919081815260200182805461060390612734565b80156106505780601f1061062557610100808354040283529160200191610650565b820191906000526020600020905b81548152906001019060200180831161063357829003601f168201915b5050505050905090565b600061066582611734565b61069b576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106e482610d78565b90508073ffffffffffffffffffffffffffffffffffffffff16610705611793565b73ffffffffffffffffffffffffffffffffffffffff1614610768576107318161072c611793565b61152a565b610767576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061082761179b565b6001546000540303905090565b600061083f826117a4565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146108a6576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806108b284611870565b915091506108c881876108c3611793565b611897565b610914576108dd866108d8611793565b61152a565b610913576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361097a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61098786868660016118db565b801561099257600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610a6085610a3c8888876118e1565b7c020000000000000000000000000000000000000000000000000000000017611909565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610ae65760006001850190506000600460008381526020019081526020016000205403610ae4576000548114610ae3578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610b4e8686866001611934565b505050505050565b6000806000600960008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610ceb5760086040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610cf561193a565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610d219190612794565b610d2b9190612805565b90508160000151819350935050509250929050565b614e2081565b6daaeb6d7670e522a718067333cd4e81565b610d73838383604051806020016040528060008152506113a9565b505050565b6000610d83826117a4565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610df1576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610e4a611944565b73ffffffffffffffffffffffffffffffffffffffff16610e68610eca565b73ffffffffffffffffffffffffffffffffffffffff1614610ebe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb590612882565b60405180910390fd5b610ec8600061194c565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610f0390612734565b80601f0160208091040260200160405190810160405280929190818152602001828054610f2f90612734565b8015610f7c5780601f10610f5157610100808354040283529160200191610f7c565b820191906000526020600020905b815481529060010190602001808311610f5f57829003601f168201915b5050505050905090565b600381565b610f93611944565b73ffffffffffffffffffffffffffffffffffffffff16610fb1610eca565b73ffffffffffffffffffffffffffffffffffffffff1614611007576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffe90612882565b60405180910390fd5b60004790508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611052573d6000803e3d6000fd5b505050565b614e208161106361081d565b61106d91906128a2565b11156110ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a590612922565b60405180910390fd5b60018114806110bd5750600381145b806110c85750600a81145b611107576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fe9061298e565b60405180910390fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118b906129fa565b60405180910390fd5b600381116111ab576111a63382611a12565b6111ff565b662386f26fc1000034146111f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111eb90612a66565b60405180910390fd5b6111fe3382611a12565b5b6001600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550803373ffffffffffffffffffffffffffffffffffffffff167f52277f0b4a9b555c5aa96900a13546f972bda413737ec164aac947c87eec602460405160405180910390a350565b80600760006112ab611793565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611358611793565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161139d919061206f565b60405180910390a35050565b6113b4848484610834565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611416576113df84848484611a30565b611415576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061142782611734565b611466576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145d90612af8565b60405180910390fd5b600b61147183611b80565b604051602001611482929190612bec565b6040516020818303038152906040529050919050565b6114a0611944565b73ffffffffffffffffffffffffffffffffffffffff166114be610eca565b73ffffffffffffffffffffffffffffffffffffffff1614611514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150b90612882565b60405180910390fd5b8181600b9182611525929190612da8565b505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115c6611944565b73ffffffffffffffffffffffffffffffffffffffff166115e4610eca565b73ffffffffffffffffffffffffffffffffffffffff161461163a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163190612882565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036116a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a090612eea565b60405180910390fd5b6116b28161194c565b50565b600a81565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061172d575061172c82611ce0565b5b9050919050565b60008161173f61179b565b1115801561174e575060005482105b801561178c575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b600080829050806117b361179b565b11611839576000548110156118385760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611836575b6000810361182c576004600083600190039350838152602001908152602001600020549050611802565b809250505061186b565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86118f8868684611d4a565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000612710905090565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611a2c828260405180602001604052806000815250611d53565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611a56611793565b8786866040518563ffffffff1660e01b8152600401611a789493929190612f5f565b6020604051808303816000875af1925050508015611ab457506040513d601f19601f82011682018060405250810190611ab19190612fc0565b60015b611b2d573d8060008114611ae4576040519150601f19603f3d011682016040523d82523d6000602084013e611ae9565b606091505b506000815103611b25576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060008203611bc7576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611cdb565b600082905060005b60008214611bf9578080611be290612fed565b915050600a82611bf29190612805565b9150611bcf565b60008167ffffffffffffffff811115611c1557611c1461246a565b5b6040519080825280601f01601f191660200182016040528015611c475781602001600182028036833780820191505090505b5090505b60008514611cd457600182611c609190613035565b9150600a85611c6f9190613069565b6030611c7b91906128a2565b60f81b818381518110611c9157611c9061309a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611ccd9190612805565b9450611c4b565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60009392505050565b611d5d8383611df0565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611deb57600080549050600083820390505b611d9d6000868380600101945086611a30565b611dd3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611d8a578160005414611de857600080fd5b50505b505050565b60008054905060008203611e30576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611e3d60008483856118db565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611eb483611ea560008660006118e1565b611eae85611fab565b17611909565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114611f5557808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611f1a565b5060008203611f90576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050611fa66000848385611934565b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61200481611fcf565b811461200f57600080fd5b50565b60008135905061202181611ffb565b92915050565b60006020828403121561203d5761203c611fc5565b5b600061204b84828501612012565b91505092915050565b60008115159050919050565b61206981612054565b82525050565b60006020820190506120846000830184612060565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156120c45780820151818401526020810190506120a9565b60008484015250505050565b6000601f19601f8301169050919050565b60006120ec8261208a565b6120f68185612095565b93506121068185602086016120a6565b61210f816120d0565b840191505092915050565b6000602082019050818103600083015261213481846120e1565b905092915050565b6000819050919050565b61214f8161213c565b811461215a57600080fd5b50565b60008135905061216c81612146565b92915050565b60006020828403121561218857612187611fc5565b5b60006121968482850161215d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006121ca8261219f565b9050919050565b6121da816121bf565b82525050565b60006020820190506121f560008301846121d1565b92915050565b612204816121bf565b811461220f57600080fd5b50565b600081359050612221816121fb565b92915050565b6000806040838503121561223e5761223d611fc5565b5b600061224c85828601612212565b925050602061225d8582860161215d565b9150509250929050565b6122708161213c565b82525050565b600060208201905061228b6000830184612267565b92915050565b6000806000606084860312156122aa576122a9611fc5565b5b60006122b886828701612212565b93505060206122c986828701612212565b92505060406122da8682870161215d565b9150509250925092565b600080604083850312156122fb576122fa611fc5565b5b60006123098582860161215d565b925050602061231a8582860161215d565b9150509250929050565b600060408201905061233960008301856121d1565b6123466020830184612267565b9392505050565b6000819050919050565b600061237261236d6123688461219f565b61234d565b61219f565b9050919050565b600061238482612357565b9050919050565b600061239682612379565b9050919050565b6123a68161238b565b82525050565b60006020820190506123c1600083018461239d565b92915050565b6000602082840312156123dd576123dc611fc5565b5b60006123eb84828501612212565b91505092915050565b6123fd81612054565b811461240857600080fd5b50565b60008135905061241a816123f4565b92915050565b6000806040838503121561243757612436611fc5565b5b600061244585828601612212565b92505060206124568582860161240b565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6124a2826120d0565b810181811067ffffffffffffffff821117156124c1576124c061246a565b5b80604052505050565b60006124d4611fbb565b90506124e08282612499565b919050565b600067ffffffffffffffff821115612500576124ff61246a565b5b612509826120d0565b9050602081019050919050565b82818337600083830152505050565b6000612538612533846124e5565b6124ca565b90508281526020810184848401111561255457612553612465565b5b61255f848285612516565b509392505050565b600082601f83011261257c5761257b612460565b5b813561258c848260208601612525565b91505092915050565b600080600080608085870312156125af576125ae611fc5565b5b60006125bd87828801612212565b94505060206125ce87828801612212565b93505060406125df8782880161215d565b925050606085013567ffffffffffffffff811115612600576125ff611fca565b5b61260c87828801612567565b91505092959194509250565b600080fd5b600080fd5b60008083601f84011261263857612637612460565b5b8235905067ffffffffffffffff81111561265557612654612618565b5b6020830191508360018202830111156126715761267061261d565b5b9250929050565b6000806020838503121561268f5761268e611fc5565b5b600083013567ffffffffffffffff8111156126ad576126ac611fca565b5b6126b985828601612622565b92509250509250929050565b600080604083850312156126dc576126db611fc5565b5b60006126ea85828601612212565b92505060206126fb85828601612212565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061274c57607f821691505b60208210810361275f5761275e612705565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061279f8261213c565b91506127aa8361213c565b92508282026127b88161213c565b915082820484148315176127cf576127ce612765565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006128108261213c565b915061281b8361213c565b92508261282b5761282a6127d6565b5b828204905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061286c602083612095565b915061287782612836565b602082019050919050565b6000602082019050818103600083015261289b8161285f565b9050919050565b60006128ad8261213c565b91506128b88361213c565b92508282019050808211156128d0576128cf612765565b5b92915050565b7f4552433732313a2045786365656473206d6178696d756d20737570706c790000600082015250565b600061290c601e83612095565b9150612917826128d6565b602082019050919050565b6000602082019050818103600083015261293b816128ff565b9050919050565b7f4552433732313a20496e76616c6964207175616e746974790000000000000000600082015250565b6000612978601883612095565b915061298382612942565b602082019050919050565b600060208201905081810360008301526129a78161296b565b9050919050565b7f4552433732313a20416c7265616479206d696e74656400000000000000000000600082015250565b60006129e4601683612095565b91506129ef826129ae565b602082019050919050565b60006020820190508181036000830152612a13816129d7565b9050919050565b7f4552433732313a20496e73756666696369656e74207061796d656e7400000000600082015250565b6000612a50601c83612095565b9150612a5b82612a1a565b602082019050919050565b60006020820190508181036000830152612a7f81612a43565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000612ae2602f83612095565b9150612aed82612a86565b604082019050919050565b60006020820190508181036000830152612b1181612ad5565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154612b4581612734565b612b4f8186612b18565b94506001821660008114612b6a5760018114612b7f57612bb2565b60ff1983168652811515820286019350612bb2565b612b8885612b23565b60005b83811015612baa57815481890152600182019150602081019050612b8b565b838801955050505b50505092915050565b6000612bc68261208a565b612bd08185612b18565b9350612be08185602086016120a6565b80840191505092915050565b6000612bf88285612b38565b9150612c048284612bbb565b91508190509392505050565b600082905092915050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302612c687fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612c2b565b612c728683612c2b565b95508019841693508086168417925050509392505050565b6000612ca5612ca0612c9b8461213c565b61234d565b61213c565b9050919050565b6000819050919050565b612cbf83612c8a565b612cd3612ccb82612cac565b848454612c38565b825550505050565b600090565b612ce8612cdb565b612cf3818484612cb6565b505050565b5b81811015612d1757612d0c600082612ce0565b600181019050612cf9565b5050565b601f821115612d5c57612d2d81612b23565b612d3684612c1b565b81016020851015612d45578190505b612d59612d5185612c1b565b830182612cf8565b50505b505050565b600082821c905092915050565b6000612d7f60001984600802612d61565b1980831691505092915050565b6000612d988383612d6e565b9150826002028217905092915050565b612db28383612c10565b67ffffffffffffffff811115612dcb57612dca61246a565b5b612dd58254612734565b612de0828285612d1b565b6000601f831160018114612e0f5760008415612dfd578287013590505b612e078582612d8c565b865550612e6f565b601f198416612e1d86612b23565b60005b82811015612e4557848901358255600182019150602085019450602081019050612e20565b86831015612e625784890135612e5e601f891682612d6e565b8355505b6001600288020188555050505b50505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612ed4602683612095565b9150612edf82612e78565b604082019050919050565b60006020820190508181036000830152612f0381612ec7565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000612f3182612f0a565b612f3b8185612f15565b9350612f4b8185602086016120a6565b612f54816120d0565b840191505092915050565b6000608082019050612f7460008301876121d1565b612f8160208301866121d1565b612f8e6040830185612267565b8181036060830152612fa08184612f26565b905095945050505050565b600081519050612fba81611ffb565b92915050565b600060208284031215612fd657612fd5611fc5565b5b6000612fe484828501612fab565b91505092915050565b6000612ff88261213c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361302a57613029612765565b5b600182019050919050565b60006130408261213c565b915061304b8361213c565b925082820390508181111561306357613062612765565b5b92915050565b60006130748261213c565b915061307f8361213c565b92508261308f5761308e6127d6565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220313b34f16836f2af15abc42b515f6d67aff3581949da64081b65ca550002d93164736f6c63430008120033
Deployed Bytecode Sourcemap
76578:2268:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77229:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24713:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31204:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30637:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20464:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34843:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61342:442;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;76724:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2928:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37764:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26106:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21648:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75610:103;;;;;;;;;;;;;:::i;:::-;;74959:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24889:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76773:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77520:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78183:658;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31762:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38555:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77917:258;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77678:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32153:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75868:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76819:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77229:174;77337:4;77359:36;77383:11;77359:23;:36::i;:::-;77352:43;;77229:174;;;:::o;24713:100::-;24767:13;24800:5;24793:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24713:100;:::o;31204:218::-;31280:7;31305:16;31313:7;31305;:16::i;:::-;31300:64;;31330:34;;;;;;;;;;;;;;31300:64;31384:15;:24;31400:7;31384:24;;;;;;;;;;;:30;;;;;;;;;;;;31377:37;;31204:218;;;:::o;30637:408::-;30726:13;30742:16;30750:7;30742;:16::i;:::-;30726:32;;30798:5;30775:28;;:19;:17;:19::i;:::-;:28;;;30771:175;;30823:44;30840:5;30847:19;:17;:19::i;:::-;30823:16;:44::i;:::-;30818:128;;30895:35;;;;;;;;;;;;;;30818:128;30771:175;30991:2;30958:15;:24;30974:7;30958:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;31029:7;31025:2;31009:28;;31018:5;31009:28;;;;;;;;;;;;30715:330;30637:408;;:::o;20464:323::-;20525:7;20753:15;:13;:15::i;:::-;20738:12;;20722:13;;:28;:46;20715:53;;20464:323;:::o;34843:2825::-;34985:27;35015;35034:7;35015:18;:27::i;:::-;34985:57;;35100:4;35059:45;;35075:19;35059:45;;;35055:86;;35113:28;;;;;;;;;;;;;;35055:86;35155:27;35184:23;35211:35;35238:7;35211:26;:35::i;:::-;35154:92;;;;35346:68;35371:15;35388:4;35394:19;:17;:19::i;:::-;35346:24;:68::i;:::-;35341:180;;35434:43;35451:4;35457:19;:17;:19::i;:::-;35434:16;:43::i;:::-;35429:92;;35486:35;;;;;;;;;;;;;;35429:92;35341:180;35552:1;35538:16;;:2;:16;;;35534:52;;35563:23;;;;;;;;;;;;;;35534:52;35599:43;35621:4;35627:2;35631:7;35640:1;35599:21;:43::i;:::-;35735:15;35732:160;;;35875:1;35854:19;35847:30;35732:160;36272:18;:24;36291:4;36272:24;;;;;;;;;;;;;;;;36270:26;;;;;;;;;;;;36341:18;:22;36360:2;36341:22;;;;;;;;;;;;;;;;36339:24;;;;;;;;;;;36663:146;36700:2;36749:45;36764:4;36770:2;36774:19;36749:14;:45::i;:::-;16863:8;36721:73;36663:18;:146::i;:::-;36634:17;:26;36652:7;36634:26;;;;;;;;;;;:175;;;;36980:1;16863:8;36929:19;:47;:52;36925:627;;37002:19;37034:1;37024:7;:11;37002:33;;37191:1;37157:17;:30;37175:11;37157:30;;;;;;;;;;;;:35;37153:384;;37295:13;;37280:11;:28;37276:242;;37475:19;37442:17;:30;37460:11;37442:30;;;;;;;;;;;:52;;;;37276:242;37153:384;36983:569;36925:627;37599:7;37595:2;37580:27;;37589:4;37580:27;;;;;;;;;;;;37618:42;37639:4;37645:2;37649:7;37658:1;37618:20;:42::i;:::-;34974:2694;;;34843:2825;;;:::o;61342:442::-;61439:7;61448;61468:26;61497:17;:27;61515:8;61497:27;;;;;;;;;;;61468:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61569:1;61541:30;;:7;:16;;;:30;;;61537:92;;61598:19;61588:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61537:92;61641:21;61706:17;:15;:17::i;:::-;61665:58;;61679:7;:23;;;61666:36;;:10;:36;;;;:::i;:::-;61665:58;;;;:::i;:::-;61641:82;;61744:7;:16;;;61762:13;61736:40;;;;;;61342:442;;;;;:::o;76724:42::-;76761:5;76724:42;:::o;2928:143::-;3028:42;2928:143;:::o;37764:193::-;37910:39;37927:4;37933:2;37937:7;37910:39;;;;;;;;;;;;:16;:39::i;:::-;37764:193;;;:::o;26106:152::-;26178:7;26221:27;26240:7;26221:18;:27::i;:::-;26198:52;;26106:152;;;:::o;21648:233::-;21720:7;21761:1;21744:19;;:5;:19;;;21740:60;;21772:28;;;;;;;;;;;;;;21740:60;15807:13;21818:18;:25;21837:5;21818:25;;;;;;;;;;;;;;;;:55;21811:62;;21648:233;;;:::o;75610:103::-;75190:12;:10;:12::i;:::-;75179:23;;:7;:5;:7::i;:::-;:23;;;75171:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75675:30:::1;75702:1;75675:18;:30::i;:::-;75610:103::o:0;74959:87::-;75005:7;75032:6;;;;;;;;;;;75025:13;;74959:87;:::o;24889:104::-;24945:13;24978:7;24971:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24889:104;:::o;76773:39::-;76811:1;76773:39;:::o;77520:150::-;75190:12;:10;:12::i;:::-;75179:23;;:7;:5;:7::i;:::-;:23;;;75171:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;77582:15:::1;77600:21;77582:39;;77640:3;77632:21;;:30;77654:7;77632:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;77571:99;77520:150:::0;:::o;78183:658::-;76761:5;78265:8;78249:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;78241:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;78353:1;78341:8;:13;:40;;;;76811:1;78358:8;:23;78341:40;:67;;;;76857:2;78385:8;:23;78341:67;78333:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;78457:10;:22;78468:10;78457:22;;;;;;;;;;;;;;;;;;;;;;;;;78456:23;78448:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;76811:1;78523:8;:23;78519:228;;78563:30;78573:10;78584:8;78563:9;:30::i;:::-;78519:228;;;78647:10;78634:9;:23;78626:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;78705:30;78715:10;78726:8;78705:9;:30::i;:::-;78519:228;78784:4;78759:10;:22;78770:10;78759:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;78824:8;78812:10;78804:29;;;;;;;;;;;;78183:658;:::o;31762:234::-;31909:8;31857:18;:39;31876:19;:17;:19::i;:::-;31857:39;;;;;;;;;;;;;;;:49;31897:8;31857:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;31969:8;31933:55;;31948:19;:17;:19::i;:::-;31933:55;;;31979:8;31933:55;;;;;;:::i;:::-;;;;;;;;31762:234;;:::o;38555:407::-;38730:31;38743:4;38749:2;38753:7;38730:12;:31::i;:::-;38794:1;38776:2;:14;;;:19;38772:183;;38815:56;38846:4;38852:2;38856:7;38865:5;38815:30;:56::i;:::-;38810:145;;38899:40;;;;;;;;;;;;;;38810:145;38772:183;38555:407;;;;:::o;77917:258::-;77982:13;78017:16;78025:7;78017;:16::i;:::-;78008:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;78126:13;78140:25;78157:7;78140:16;:25::i;:::-;78109:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;78095:72;;77917:258;;;:::o;77678:109::-;75190:12;:10;:12::i;:::-;75179:23;;:7;:5;:7::i;:::-;:23;;;75171:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;77770:9:::1;;77754:13;:25;;;;;;;:::i;:::-;;77678:109:::0;;:::o;32153:164::-;32250:4;32274:18;:25;32293:5;32274:25;;;;;;;;;;;;;;;:35;32300:8;32274:35;;;;;;;;;;;;;;;;;;;;;;;;;32267:42;;32153:164;;;;:::o;75868:201::-;75190:12;:10;:12::i;:::-;75179:23;;:7;:5;:7::i;:::-;:23;;;75171:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75977:1:::1;75957:22;;:8;:22;;::::0;75949:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;76033:28;76052:8;76033:18;:28::i;:::-;75868:201:::0;:::o;76819:40::-;76857:2;76819:40;:::o;61072:215::-;61174:4;61213:26;61198:41;;;:11;:41;;;;:81;;;;61243:36;61267:11;61243:23;:36::i;:::-;61198:81;61191:88;;61072:215;;;:::o;32575:282::-;32640:4;32696:7;32677:15;:13;:15::i;:::-;:26;;:66;;;;;32730:13;;32720:7;:23;32677:66;:153;;;;;32829:1;16583:8;32781:17;:26;32799:7;32781:26;;;;;;;;;;;;:44;:49;32677:153;32657:173;;32575:282;;;:::o;54883:105::-;54943:7;54970:10;54963:17;;54883:105;:::o;77411:101::-;77476:7;77503:1;77496:8;;77411:101;:::o;27261:1275::-;27328:7;27348:12;27363:7;27348:22;;27431:4;27412:15;:13;:15::i;:::-;:23;27408:1061;;27465:13;;27458:4;:20;27454:1015;;;27503:14;27520:17;:23;27538:4;27520:23;;;;;;;;;;;;27503:40;;27637:1;16583:8;27609:6;:24;:29;27605:845;;28274:113;28291:1;28281:6;:11;28274:113;;28334:17;:25;28352:6;;;;;;;28334:25;;;;;;;;;;;;28325:34;;28274:113;;;28420:6;28413:13;;;;;;27605:845;27480:989;27454:1015;27408:1061;28497:31;;;;;;;;;;;;;;27261:1275;;;;:::o;33738:485::-;33840:27;33869:23;33910:38;33951:15;:24;33967:7;33951:24;;;;;;;;;;;33910:65;;34128:18;34105:41;;34185:19;34179:26;34160:45;;34090:126;33738:485;;;:::o;32966:659::-;33115:11;33280:16;33273:5;33269:28;33260:37;;33440:16;33429:9;33425:32;33412:45;;33590:15;33579:9;33576:30;33568:5;33557:9;33554:20;33551:56;33541:66;;32966:659;;;;;:::o;39624:159::-;;;;;:::o;54192:311::-;54327:7;54347:16;16987:3;54373:19;:41;;54347:68;;16987:3;54441:31;54452:4;54458:2;54462:9;54441:10;:31::i;:::-;54433:40;;:62;;54426:69;;;54192:311;;;;;:::o;29084:450::-;29164:14;29332:16;29325:5;29321:28;29312:37;;29509:5;29495:11;29470:23;29466:41;29463:52;29456:5;29453:63;29443:73;;29084:450;;;;:::o;40448:158::-;;;;;:::o;62066:97::-;62124:6;62150:5;62143:12;;62066:97;:::o;73683:98::-;73736:7;73763:10;73756:17;;73683:98;:::o;76229:191::-;76303:16;76322:6;;;;;;;;;;;76303:25;;76348:8;76339:6;;:17;;;;;;;;;;;;;;;;;;76403:8;76372:40;;76393:8;76372:40;;;;;;;;;;;;76292:128;76229:191;:::o;48715:112::-;48792:27;48802:2;48806:8;48792:27;;;;;;;;;;;;:9;:27::i;:::-;48715:112;;:::o;41046:716::-;41209:4;41255:2;41230:45;;;41276:19;:17;:19::i;:::-;41297:4;41303:7;41312:5;41230:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41226:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41530:1;41513:6;:13;:18;41509:235;;41559:40;;;;;;;;;;;;;;41509:235;41702:6;41696:13;41687:6;41683:2;41679:15;41672:38;41226:529;41399:54;;;41389:64;;;:6;:64;;;;41382:71;;;41046:716;;;;;;:::o;71245:723::-;71301:13;71531:1;71522:5;:10;71518:53;;71549:10;;;;;;;;;;;;;;;;;;;;;71518:53;71581:12;71596:5;71581:20;;71612:14;71637:78;71652:1;71644:4;:9;71637:78;;71670:8;;;;;:::i;:::-;;;;71701:2;71693:10;;;;;:::i;:::-;;;71637:78;;;71725:19;71757:6;71747:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71725:39;;71775:154;71791:1;71782:5;:10;71775:154;;71819:1;71809:11;;;;;:::i;:::-;;;71886:2;71878:5;:10;;;;:::i;:::-;71865:2;:24;;;;:::i;:::-;71852:39;;71835:6;71842;71835:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;71915:2;71906:11;;;;;:::i;:::-;;;71775:154;;;71953:6;71939:21;;;;;71245:723;;;;:::o;58624:157::-;58709:4;58748:25;58733:40;;;:11;:40;;;;58726:47;;58624:157;;;:::o;53893:147::-;54030:6;53893:147;;;;;:::o;47942:689::-;48073:19;48079:2;48083:8;48073:5;:19::i;:::-;48152:1;48134:2;:14;;;:19;48130:483;;48174:11;48188:13;;48174:27;;48220:13;48242:8;48236:3;:14;48220:30;;48269:233;48300:62;48339:1;48343:2;48347:7;;;;;;48356:5;48300:30;:62::i;:::-;48295:167;;48398:40;;;;;;;;;;;;;;48295:167;48497:3;48489:5;:11;48269:233;;48584:3;48567:13;;:20;48563:34;;48589:8;;;48563:34;48155:458;;48130:483;47942:689;;;:::o;42224:2966::-;42297:20;42320:13;;42297:36;;42360:1;42348:8;:13;42344:44;;42370:18;;;;;;;;;;;;;;42344:44;42401:61;42431:1;42435:2;42439:12;42453:8;42401:21;:61::i;:::-;42945:1;15945:2;42915:1;:26;;42914:32;42902:8;:45;42876:18;:22;42895:2;42876:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;43224:139;43261:2;43315:33;43338:1;43342:2;43346:1;43315:14;:33::i;:::-;43282:30;43303:8;43282:20;:30::i;:::-;:66;43224:18;:139::i;:::-;43190:17;:31;43208:12;43190:31;;;;;;;;;;;:173;;;;43380:16;43411:11;43440:8;43425:12;:23;43411:37;;43961:16;43957:2;43953:25;43941:37;;44333:12;44293:8;44252:1;44190:25;44131:1;44070;44043:335;44704:1;44690:12;44686:20;44644:346;44745:3;44736:7;44733:16;44644:346;;44963:7;44953:8;44950:1;44923:25;44920:1;44917;44912:59;44798:1;44789:7;44785:15;44774:26;;44644:346;;;44648:77;45035:1;45023:8;:13;45019:45;;45045:19;;;;;;;;;;;;;;45019:45;45097:3;45081:13;:19;;;;42650:2462;;45122:60;45151:1;45155:2;45159:12;45173:8;45122:20;:60::i;:::-;42286:2904;42224:2966;;:::o;29636:324::-;29706:14;29939:1;29929:8;29926:15;29900:24;29896:46;29886:56;;29636:324;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:474::-;5935:6;5943;5992:2;5980:9;5971:7;5967:23;5963:32;5960:119;;;5998:79;;:::i;:::-;5960:119;6118:1;6143:53;6188:7;6179:6;6168:9;6164:22;6143:53;:::i;:::-;6133:63;;6089:117;6245:2;6271:53;6316:7;6307:6;6296:9;6292:22;6271:53;:::i;:::-;6261:63;;6216:118;5867:474;;;;;:::o;6347:332::-;6468:4;6506:2;6495:9;6491:18;6483:26;;6519:71;6587:1;6576:9;6572:17;6563:6;6519:71;:::i;:::-;6600:72;6668:2;6657:9;6653:18;6644:6;6600:72;:::i;:::-;6347:332;;;;;:::o;6685:60::-;6713:3;6734:5;6727:12;;6685:60;;;:::o;6751:142::-;6801:9;6834:53;6852:34;6861:24;6879:5;6861:24;:::i;:::-;6852:34;:::i;:::-;6834:53;:::i;:::-;6821:66;;6751:142;;;:::o;6899:126::-;6949:9;6982:37;7013:5;6982:37;:::i;:::-;6969:50;;6899:126;;;:::o;7031:157::-;7112:9;7145:37;7176:5;7145:37;:::i;:::-;7132:50;;7031:157;;;:::o;7194:193::-;7312:68;7374:5;7312:68;:::i;:::-;7307:3;7300:81;7194:193;;:::o;7393:284::-;7517:4;7555:2;7544:9;7540:18;7532:26;;7568:102;7667:1;7656:9;7652:17;7643:6;7568:102;:::i;:::-;7393:284;;;;:::o;7683:329::-;7742:6;7791:2;7779:9;7770:7;7766:23;7762:32;7759:119;;;7797:79;;:::i;:::-;7759:119;7917:1;7942:53;7987:7;7978:6;7967:9;7963:22;7942:53;:::i;:::-;7932:63;;7888:117;7683:329;;;;:::o;8018:116::-;8088:21;8103:5;8088:21;:::i;:::-;8081:5;8078:32;8068:60;;8124:1;8121;8114:12;8068:60;8018:116;:::o;8140:133::-;8183:5;8221:6;8208:20;8199:29;;8237:30;8261:5;8237:30;:::i;:::-;8140:133;;;;:::o;8279:468::-;8344:6;8352;8401:2;8389:9;8380:7;8376:23;8372:32;8369:119;;;8407:79;;:::i;:::-;8369:119;8527:1;8552:53;8597:7;8588:6;8577:9;8573:22;8552:53;:::i;:::-;8542:63;;8498:117;8654:2;8680:50;8722:7;8713:6;8702:9;8698:22;8680:50;:::i;:::-;8670:60;;8625:115;8279:468;;;;;:::o;8753:117::-;8862:1;8859;8852:12;8876:117;8985:1;8982;8975:12;8999:180;9047:77;9044:1;9037:88;9144:4;9141:1;9134:15;9168:4;9165:1;9158:15;9185:281;9268:27;9290:4;9268:27;:::i;:::-;9260:6;9256:40;9398:6;9386:10;9383:22;9362:18;9350:10;9347:34;9344:62;9341:88;;;9409:18;;:::i;:::-;9341:88;9449:10;9445:2;9438:22;9228:238;9185:281;;:::o;9472:129::-;9506:6;9533:20;;:::i;:::-;9523:30;;9562:33;9590:4;9582:6;9562:33;:::i;:::-;9472:129;;;:::o;9607:307::-;9668:4;9758:18;9750:6;9747:30;9744:56;;;9780:18;;:::i;:::-;9744:56;9818:29;9840:6;9818:29;:::i;:::-;9810:37;;9902:4;9896;9892:15;9884:23;;9607:307;;;:::o;9920:146::-;10017:6;10012:3;10007;9994:30;10058:1;10049:6;10044:3;10040:16;10033:27;9920:146;;;:::o;10072:423::-;10149:5;10174:65;10190:48;10231:6;10190:48;:::i;:::-;10174:65;:::i;:::-;10165:74;;10262:6;10255:5;10248:21;10300:4;10293:5;10289:16;10338:3;10329:6;10324:3;10320:16;10317:25;10314:112;;;10345:79;;:::i;:::-;10314:112;10435:54;10482:6;10477:3;10472;10435:54;:::i;:::-;10155:340;10072:423;;;;;:::o;10514:338::-;10569:5;10618:3;10611:4;10603:6;10599:17;10595:27;10585:122;;10626:79;;:::i;:::-;10585:122;10743:6;10730:20;10768:78;10842:3;10834:6;10827:4;10819:6;10815:17;10768:78;:::i;:::-;10759:87;;10575:277;10514:338;;;;:::o;10858:943::-;10953:6;10961;10969;10977;11026:3;11014:9;11005:7;11001:23;10997:33;10994:120;;;11033:79;;:::i;:::-;10994:120;11153:1;11178:53;11223:7;11214:6;11203:9;11199:22;11178:53;:::i;:::-;11168:63;;11124:117;11280:2;11306:53;11351:7;11342:6;11331:9;11327:22;11306:53;:::i;:::-;11296:63;;11251:118;11408:2;11434:53;11479:7;11470:6;11459:9;11455:22;11434:53;:::i;:::-;11424:63;;11379:118;11564:2;11553:9;11549:18;11536:32;11595:18;11587:6;11584:30;11581:117;;;11617:79;;:::i;:::-;11581:117;11722:62;11776:7;11767:6;11756:9;11752:22;11722:62;:::i;:::-;11712:72;;11507:287;10858:943;;;;;;;:::o;11807:117::-;11916:1;11913;11906:12;11930:117;12039:1;12036;12029:12;12067:553;12125:8;12135:6;12185:3;12178:4;12170:6;12166:17;12162:27;12152:122;;12193:79;;:::i;:::-;12152:122;12306:6;12293:20;12283:30;;12336:18;12328:6;12325:30;12322:117;;;12358:79;;:::i;:::-;12322:117;12472:4;12464:6;12460:17;12448:29;;12526:3;12518:4;12510:6;12506:17;12496:8;12492:32;12489:41;12486:128;;;12533:79;;:::i;:::-;12486:128;12067:553;;;;;:::o;12626:529::-;12697:6;12705;12754:2;12742:9;12733:7;12729:23;12725:32;12722:119;;;12760:79;;:::i;:::-;12722:119;12908:1;12897:9;12893:17;12880:31;12938:18;12930:6;12927:30;12924:117;;;12960:79;;:::i;:::-;12924:117;13073:65;13130:7;13121:6;13110:9;13106:22;13073:65;:::i;:::-;13055:83;;;;12851:297;12626:529;;;;;:::o;13161:474::-;13229:6;13237;13286:2;13274:9;13265:7;13261:23;13257:32;13254:119;;;13292:79;;:::i;:::-;13254:119;13412:1;13437:53;13482:7;13473:6;13462:9;13458:22;13437:53;:::i;:::-;13427:63;;13383:117;13539:2;13565:53;13610:7;13601:6;13590:9;13586:22;13565:53;:::i;:::-;13555:63;;13510:118;13161:474;;;;;:::o;13641:180::-;13689:77;13686:1;13679:88;13786:4;13783:1;13776:15;13810:4;13807:1;13800:15;13827:320;13871:6;13908:1;13902:4;13898:12;13888:22;;13955:1;13949:4;13945:12;13976:18;13966:81;;14032:4;14024:6;14020:17;14010:27;;13966:81;14094:2;14086:6;14083:14;14063:18;14060:38;14057:84;;14113:18;;:::i;:::-;14057:84;13878:269;13827:320;;;:::o;14153:180::-;14201:77;14198:1;14191:88;14298:4;14295:1;14288:15;14322:4;14319:1;14312:15;14339:410;14379:7;14402:20;14420:1;14402:20;:::i;:::-;14397:25;;14436:20;14454:1;14436:20;:::i;:::-;14431:25;;14491:1;14488;14484:9;14513:30;14531:11;14513:30;:::i;:::-;14502:41;;14692:1;14683:7;14679:15;14676:1;14673:22;14653:1;14646:9;14626:83;14603:139;;14722:18;;:::i;:::-;14603:139;14387:362;14339:410;;;;:::o;14755:180::-;14803:77;14800:1;14793:88;14900:4;14897:1;14890:15;14924:4;14921:1;14914:15;14941:185;14981:1;14998:20;15016:1;14998:20;:::i;:::-;14993:25;;15032:20;15050:1;15032:20;:::i;:::-;15027:25;;15071:1;15061:35;;15076:18;;:::i;:::-;15061:35;15118:1;15115;15111:9;15106:14;;14941:185;;;;:::o;15132:182::-;15272:34;15268:1;15260:6;15256:14;15249:58;15132:182;:::o;15320:366::-;15462:3;15483:67;15547:2;15542:3;15483:67;:::i;:::-;15476:74;;15559:93;15648:3;15559:93;:::i;:::-;15677:2;15672:3;15668:12;15661:19;;15320:366;;;:::o;15692:419::-;15858:4;15896:2;15885:9;15881:18;15873:26;;15945:9;15939:4;15935:20;15931:1;15920:9;15916:17;15909:47;15973:131;16099:4;15973:131;:::i;:::-;15965:139;;15692:419;;;:::o;16117:191::-;16157:3;16176:20;16194:1;16176:20;:::i;:::-;16171:25;;16210:20;16228:1;16210:20;:::i;:::-;16205:25;;16253:1;16250;16246:9;16239:16;;16274:3;16271:1;16268:10;16265:36;;;16281:18;;:::i;:::-;16265:36;16117:191;;;;:::o;16314:180::-;16454:32;16450:1;16442:6;16438:14;16431:56;16314:180;:::o;16500:366::-;16642:3;16663:67;16727:2;16722:3;16663:67;:::i;:::-;16656:74;;16739:93;16828:3;16739:93;:::i;:::-;16857:2;16852:3;16848:12;16841:19;;16500:366;;;:::o;16872:419::-;17038:4;17076:2;17065:9;17061:18;17053:26;;17125:9;17119:4;17115:20;17111:1;17100:9;17096:17;17089:47;17153:131;17279:4;17153:131;:::i;:::-;17145:139;;16872:419;;;:::o;17297:174::-;17437:26;17433:1;17425:6;17421:14;17414:50;17297:174;:::o;17477:366::-;17619:3;17640:67;17704:2;17699:3;17640:67;:::i;:::-;17633:74;;17716:93;17805:3;17716:93;:::i;:::-;17834:2;17829:3;17825:12;17818:19;;17477:366;;;:::o;17849:419::-;18015:4;18053:2;18042:9;18038:18;18030:26;;18102:9;18096:4;18092:20;18088:1;18077:9;18073:17;18066:47;18130:131;18256:4;18130:131;:::i;:::-;18122:139;;17849:419;;;:::o;18274:172::-;18414:24;18410:1;18402:6;18398:14;18391:48;18274:172;:::o;18452:366::-;18594:3;18615:67;18679:2;18674:3;18615:67;:::i;:::-;18608:74;;18691:93;18780:3;18691:93;:::i;:::-;18809:2;18804:3;18800:12;18793:19;;18452:366;;;:::o;18824:419::-;18990:4;19028:2;19017:9;19013:18;19005:26;;19077:9;19071:4;19067:20;19063:1;19052:9;19048:17;19041:47;19105:131;19231:4;19105:131;:::i;:::-;19097:139;;18824:419;;;:::o;19249:178::-;19389:30;19385:1;19377:6;19373:14;19366:54;19249:178;:::o;19433:366::-;19575:3;19596:67;19660:2;19655:3;19596:67;:::i;:::-;19589:74;;19672:93;19761:3;19672:93;:::i;:::-;19790:2;19785:3;19781:12;19774:19;;19433:366;;;:::o;19805:419::-;19971:4;20009:2;19998:9;19994:18;19986:26;;20058:9;20052:4;20048:20;20044:1;20033:9;20029:17;20022:47;20086:131;20212:4;20086:131;:::i;:::-;20078:139;;19805:419;;;:::o;20230:234::-;20370:34;20366:1;20358:6;20354:14;20347:58;20439:17;20434:2;20426:6;20422:15;20415:42;20230:234;:::o;20470:366::-;20612:3;20633:67;20697:2;20692:3;20633:67;:::i;:::-;20626:74;;20709:93;20798:3;20709:93;:::i;:::-;20827:2;20822:3;20818:12;20811:19;;20470:366;;;:::o;20842:419::-;21008:4;21046:2;21035:9;21031:18;21023:26;;21095:9;21089:4;21085:20;21081:1;21070:9;21066:17;21059:47;21123:131;21249:4;21123:131;:::i;:::-;21115:139;;20842:419;;;:::o;21267:148::-;21369:11;21406:3;21391:18;;21267:148;;;;:::o;21421:141::-;21470:4;21493:3;21485:11;;21516:3;21513:1;21506:14;21550:4;21547:1;21537:18;21529:26;;21421:141;;;:::o;21592:874::-;21695:3;21732:5;21726:12;21761:36;21787:9;21761:36;:::i;:::-;21813:89;21895:6;21890:3;21813:89;:::i;:::-;21806:96;;21933:1;21922:9;21918:17;21949:1;21944:166;;;;22124:1;22119:341;;;;21911:549;;21944:166;22028:4;22024:9;22013;22009:25;22004:3;21997:38;22090:6;22083:14;22076:22;22068:6;22064:35;22059:3;22055:45;22048:52;;21944:166;;22119:341;22186:38;22218:5;22186:38;:::i;:::-;22246:1;22260:154;22274:6;22271:1;22268:13;22260:154;;;22348:7;22342:14;22338:1;22333:3;22329:11;22322:35;22398:1;22389:7;22385:15;22374:26;;22296:4;22293:1;22289:12;22284:17;;22260:154;;;22443:6;22438:3;22434:16;22427:23;;22126:334;;21911:549;;21699:767;;21592:874;;;;:::o;22472:390::-;22578:3;22606:39;22639:5;22606:39;:::i;:::-;22661:89;22743:6;22738:3;22661:89;:::i;:::-;22654:96;;22759:65;22817:6;22812:3;22805:4;22798:5;22794:16;22759:65;:::i;:::-;22849:6;22844:3;22840:16;22833:23;;22582:280;22472:390;;;;:::o;22868:429::-;23045:3;23067:92;23155:3;23146:6;23067:92;:::i;:::-;23060:99;;23176:95;23267:3;23258:6;23176:95;:::i;:::-;23169:102;;23288:3;23281:10;;22868:429;;;;;:::o;23303:97::-;23362:6;23390:3;23380:13;;23303:97;;;;:::o;23406:93::-;23443:6;23490:2;23485;23478:5;23474:14;23470:23;23460:33;;23406:93;;;:::o;23505:107::-;23549:8;23599:5;23593:4;23589:16;23568:37;;23505:107;;;;:::o;23618:393::-;23687:6;23737:1;23725:10;23721:18;23760:97;23790:66;23779:9;23760:97;:::i;:::-;23878:39;23908:8;23897:9;23878:39;:::i;:::-;23866:51;;23950:4;23946:9;23939:5;23935:21;23926:30;;23999:4;23989:8;23985:19;23978:5;23975:30;23965:40;;23694:317;;23618:393;;;;;:::o;24017:142::-;24067:9;24100:53;24118:34;24127:24;24145:5;24127:24;:::i;:::-;24118:34;:::i;:::-;24100:53;:::i;:::-;24087:66;;24017:142;;;:::o;24165:75::-;24208:3;24229:5;24222:12;;24165:75;;;:::o;24246:269::-;24356:39;24387:7;24356:39;:::i;:::-;24417:91;24466:41;24490:16;24466:41;:::i;:::-;24458:6;24451:4;24445:11;24417:91;:::i;:::-;24411:4;24404:105;24322:193;24246:269;;;:::o;24521:73::-;24566:3;24521:73;:::o;24600:189::-;24677:32;;:::i;:::-;24718:65;24776:6;24768;24762:4;24718:65;:::i;:::-;24653:136;24600:189;;:::o;24795:186::-;24855:120;24872:3;24865:5;24862:14;24855:120;;;24926:39;24963:1;24956:5;24926:39;:::i;:::-;24899:1;24892:5;24888:13;24879:22;;24855:120;;;24795:186;;:::o;24987:543::-;25088:2;25083:3;25080:11;25077:446;;;25122:38;25154:5;25122:38;:::i;:::-;25206:29;25224:10;25206:29;:::i;:::-;25196:8;25192:44;25389:2;25377:10;25374:18;25371:49;;;25410:8;25395:23;;25371:49;25433:80;25489:22;25507:3;25489:22;:::i;:::-;25479:8;25475:37;25462:11;25433:80;:::i;:::-;25092:431;;25077:446;24987:543;;;:::o;25536:117::-;25590:8;25640:5;25634:4;25630:16;25609:37;;25536:117;;;;:::o;25659:169::-;25703:6;25736:51;25784:1;25780:6;25772:5;25769:1;25765:13;25736:51;:::i;:::-;25732:56;25817:4;25811;25807:15;25797:25;;25710:118;25659:169;;;;:::o;25833:295::-;25909:4;26055:29;26080:3;26074:4;26055:29;:::i;:::-;26047:37;;26117:3;26114:1;26110:11;26104:4;26101:21;26093:29;;25833:295;;;;:::o;26133:1403::-;26257:44;26297:3;26292;26257:44;:::i;:::-;26366:18;26358:6;26355:30;26352:56;;;26388:18;;:::i;:::-;26352:56;26432:38;26464:4;26458:11;26432:38;:::i;:::-;26517:67;26577:6;26569;26563:4;26517:67;:::i;:::-;26611:1;26640:2;26632:6;26629:14;26657:1;26652:632;;;;27328:1;27345:6;27342:84;;;27401:9;27396:3;27392:19;27379:33;27370:42;;27342:84;27452:67;27512:6;27505:5;27452:67;:::i;:::-;27446:4;27439:81;27301:229;26622:908;;26652:632;26704:4;26700:9;26692:6;26688:22;26738:37;26770:4;26738:37;:::i;:::-;26797:1;26811:215;26825:7;26822:1;26819:14;26811:215;;;26911:9;26906:3;26902:19;26889:33;26881:6;26874:49;26962:1;26954:6;26950:14;26940:24;;27009:2;26998:9;26994:18;26981:31;;26848:4;26845:1;26841:12;26836:17;;26811:215;;;27054:6;27045:7;27042:19;27039:186;;;27119:9;27114:3;27110:19;27097:33;27162:48;27204:4;27196:6;27192:17;27181:9;27162:48;:::i;:::-;27154:6;27147:64;27062:163;27039:186;27271:1;27267;27259:6;27255:14;27251:22;27245:4;27238:36;26659:625;;;26622:908;;26232:1304;;;26133:1403;;;:::o;27542:225::-;27682:34;27678:1;27670:6;27666:14;27659:58;27751:8;27746:2;27738:6;27734:15;27727:33;27542:225;:::o;27773:366::-;27915:3;27936:67;28000:2;27995:3;27936:67;:::i;:::-;27929:74;;28012:93;28101:3;28012:93;:::i;:::-;28130:2;28125:3;28121:12;28114:19;;27773:366;;;:::o;28145:419::-;28311:4;28349:2;28338:9;28334:18;28326:26;;28398:9;28392:4;28388:20;28384:1;28373:9;28369:17;28362:47;28426:131;28552:4;28426:131;:::i;:::-;28418:139;;28145:419;;;:::o;28570:98::-;28621:6;28655:5;28649:12;28639:22;;28570:98;;;:::o;28674:168::-;28757:11;28791:6;28786:3;28779:19;28831:4;28826:3;28822:14;28807:29;;28674:168;;;;:::o;28848:373::-;28934:3;28962:38;28994:5;28962:38;:::i;:::-;29016:70;29079:6;29074:3;29016:70;:::i;:::-;29009:77;;29095:65;29153:6;29148:3;29141:4;29134:5;29130:16;29095:65;:::i;:::-;29185:29;29207:6;29185:29;:::i;:::-;29180:3;29176:39;29169:46;;28938:283;28848:373;;;;:::o;29227:640::-;29422:4;29460:3;29449:9;29445:19;29437:27;;29474:71;29542:1;29531:9;29527:17;29518:6;29474:71;:::i;:::-;29555:72;29623:2;29612:9;29608:18;29599:6;29555:72;:::i;:::-;29637;29705:2;29694:9;29690:18;29681:6;29637:72;:::i;:::-;29756:9;29750:4;29746:20;29741:2;29730:9;29726:18;29719:48;29784:76;29855:4;29846:6;29784:76;:::i;:::-;29776:84;;29227:640;;;;;;;:::o;29873:141::-;29929:5;29960:6;29954:13;29945:22;;29976:32;30002:5;29976:32;:::i;:::-;29873:141;;;;:::o;30020:349::-;30089:6;30138:2;30126:9;30117:7;30113:23;30109:32;30106:119;;;30144:79;;:::i;:::-;30106:119;30264:1;30289:63;30344:7;30335:6;30324:9;30320:22;30289:63;:::i;:::-;30279:73;;30235:127;30020:349;;;;:::o;30375:233::-;30414:3;30437:24;30455:5;30437:24;:::i;:::-;30428:33;;30483:66;30476:5;30473:77;30470:103;;30553:18;;:::i;:::-;30470:103;30600:1;30593:5;30589:13;30582:20;;30375:233;;;:::o;30614:194::-;30654:4;30674:20;30692:1;30674:20;:::i;:::-;30669:25;;30708:20;30726:1;30708:20;:::i;:::-;30703:25;;30752:1;30749;30745:9;30737:17;;30776:1;30770:4;30767:11;30764:37;;;30781:18;;:::i;:::-;30764:37;30614:194;;;;:::o;30814:176::-;30846:1;30863:20;30881:1;30863:20;:::i;:::-;30858:25;;30897:20;30915:1;30897:20;:::i;:::-;30892:25;;30936:1;30926:35;;30941:18;;:::i;:::-;30926:35;30982:1;30979;30975:9;30970:14;;30814:176;;;;:::o;30996:180::-;31044:77;31041:1;31034:88;31141:4;31138:1;31131:15;31165:4;31162:1;31155:15
Swarm Source
ipfs://313b34f16836f2af15abc42b515f6d67aff3581949da64081b65ca550002d931
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ 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.