Token NFT Jeton CFC
Overview CRC721
Total Supply:
18,861 JCFC
Holders:
320 addresses
Contract:
Balance
2 JCFC
[ Download CSV Export ]
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
NftJeton
Compiler Version
v0.8.14+commit.80d49f37
Contract Source Code (Solidity)
/** *Submitted for verification at cronoscan.com on 2022-07-26 */ // File: contracts/ERC721A/IERC721A.sol // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * 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(); struct TokenOwnership { // The address of the owner. address addr; // Keeps track of 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 through `_extraData`. uint24 extraData; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); // ============================== // 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); // ============================== // 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`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev 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 standard. See `_mintERC2309` for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: contracts/ERC721A/ERC721A.sol // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev ERC721 token receiver interface. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, * including the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at `_startTokenId()` * (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // 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 tokenId of the next token 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 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * @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 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 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 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 returns (uint256) { return _burnCounter; } /** * @dev See {IERC165-supportsInterface}. */ 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: 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. } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view 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 { 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; } /** * 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 ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * 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); } /** * Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @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 See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { 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 ''; } /** * @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)) } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned. } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, 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 { _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 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 { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); 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 tokenId = startTokenId; uint256 end = startTokenId + quantity; do { emit Transfer(address(0), to, tokenId++); } while (tokenId < end); _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 { 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 Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`. assembly { // Compute the slot. mstore(0x00, tokenId) mstore(0x20, tokenApprovalsPtr.slot) approvedAddressSlot := keccak256(0x00, 0x40) // Load the slot's value from storage. approvedAddress := sload(approvedAddressSlot) } } /** * @dev Returns whether the `approvedAddress` is equals to `from` or `msgSender`. */ function _isOwnerOrApproved( address approvedAddress, address from, address msgSender ) private pure returns (bool result) { assembly { // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean. from := and(from, BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, BITMASK_ADDRESS) // `msgSender == from || msgSender == approvedAddress`. result := or(eq(msgSender, from), eq(msgSender, approvedAddress)) } } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(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 `_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) = _getApprovedAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(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++; } } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _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)) } } } } /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal { 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 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; } /** * @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 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 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 returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } } // File: contracts/ERC721A/extensions/IERC721AQueryable.sol // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721AQueryable compliant contract. */ interface IERC721AQueryable is IERC721A { /** * Invalid query range (`start` >= `stop`). */ error InvalidQueryRange(); /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * - `addr` = `address(0)` * - `startTimestamp` = `0` * - `burned` = `false` * * If the `tokenId` is burned: * - `addr` = `<Address of owner before token was burned>` * - `startTimestamp` = `<Timestamp when token was burned>` * - `burned = `true` * * Otherwise: * - `addr` = `<Address of owner>` * - `startTimestamp` = `<Timestamp of start of ownership>` * - `burned = `false` */ function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory); /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory); /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start` < `stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view returns (uint256[] memory); /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(totalSupply) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K pfp collections should be fine). */ function tokensOfOwner(address owner) external view returns (uint256[] memory); } // File: contracts/ERC721A/extensions/ERC721AQueryable.sol // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.14; /** * @title ERC721A Queryable * @dev ERC721A subclass with convenience query functions. */ abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable { /** * @dev Returns the `TokenOwnership` struct at `toskenId` without reverting. * * If the `tokenId` is out of bounds: * - `addr` = `address(0)` * - `startTimestamp` = `0` * - `burned` = `false` * - `extraData` = `0` * * If the `tokenId` is burned: * - `addr` = `<Address of owner before token was burned>` * - `startTimestamp` = `<Timestamp when token was burned>` * - `burned = `true` * - `extraData` = `<Extra data when token was burned>` * * Otherwise: * - `addr` = `<Address of owner>` * - `startTimestamp` = `<Timestamp of start of ownership>` * - `burned = `false` * - `extraData` = `<Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) public view override returns (TokenOwnership memory) { TokenOwnership memory ownership; if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) { return ownership; } ownership = _ownershipAt(tokenId); if (ownership.burned) { return ownership; } return _ownershipOf(tokenId); } /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view override returns (TokenOwnership[] memory) { unchecked { uint256 tokenIdsLength = tokenIds.length; TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength); for (uint256 i; i != tokenIdsLength; ++i) { ownerships[i] = explicitOwnershipOf(tokenIds[i]); } return ownerships; } } /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start` < `stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view override returns (uint256[] memory) { unchecked { if (start >= stop) revert InvalidQueryRange(); uint256 tokenIdsIdx; uint256 stopLimit = _nextTokenId(); // Set `start = max(start, _startTokenId())`. if (start < _startTokenId()) { start = _startTokenId(); } // Set `stop = min(stop, stopLimit)`. if (stop > stopLimit) { stop = stopLimit; } uint256 tokenIdsMaxLength = balanceOf(owner); // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`, // to cater for cases where `balanceOf(owner)` is too big. if (start < stop) { uint256 rangeLength = stop - start; if (rangeLength < tokenIdsMaxLength) { tokenIdsMaxLength = rangeLength; } } else { tokenIdsMaxLength = 0; } uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength); if (tokenIdsMaxLength == 0) { return tokenIds; } // We need to call `explicitOwnershipOf(start)`, // because the slot at `start` may not be initialized. TokenOwnership memory ownership = explicitOwnershipOf(start); address currOwnershipAddr; // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`. // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range. if (!ownership.burned) { currOwnershipAddr = ownership.addr; } for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } // Downsize the array to fit. assembly { mstore(tokenIds, tokenIdsIdx) } return tokenIds; } } /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(totalSupply) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K pfp collections should be fine). */ function tokensOfOwner(address owner) external view override returns (uint256[] memory) { unchecked { uint256 tokenIdsIdx; address currOwnershipAddr; uint256 tokenIdsLength = balanceOf(owner); uint256[] memory tokenIds = new uint256[](tokenIdsLength); TokenOwnership memory ownership; for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } return tokenIds; } } } // File: Cronos/CFC/NftJeton.sol pragma solidity ^0.8.14; interface INftJeton{ function mintJeton(address to, uint _quantity) external; function burnJeton(address _account, uint _quantity) external returns(bool); } contract NftJeton is ERC721AQueryable { address owner; string name_; string symbol_; address adrBurner; address adrMinter; constructor(address _adrMinter, address _adrBurner)ERC721A("NFT Jeton CFC", "JCFC"){ owner = msg.sender; name_ = "NFT Jeton CFC"; symbol_ = "JCFC"; adrMinter = _adrMinter; adrBurner = _adrBurner; } function changeOwner(address _owner) public onlyOwner { owner = _owner; } function changeBurner(address _adrBurner) public onlyOwner { adrBurner = _adrBurner; } function changeMinter(address _adrMinter) public onlyOwner { adrMinter = _adrMinter; } function mintJeton(address to, uint _quantity) external onlyMinter returns(bool) { _safeMint(to, _quantity); return true; } function burnJeton(address _account, uint _quantity) external onlyBurner returns(bool) { require(ERC721AQueryable(address(this)).balanceOf(_account) >= _quantity, "[ERROR] : You dont have enough Jeton! (burn)"); uint[] memory listIndex = ERC721AQueryable(address(this)).tokensOfOwner(_account); for(uint i = 0; i < _quantity; i++) { _burn(listIndex[i]); } return true; } function _beforeTokenTransfers(address from, address to, uint256 startTokenId, uint256 quantity) internal override { if(msg.sender != adrMinter && msg.sender != adrBurner) { require(startTokenId >= totalSupply(), "[ERROR] : You can't transfer Jetons"); } } modifier onlyOwner { require(msg.sender == owner, "[ERROR] : You are not Owner"); _; } modifier onlyBurner { require(msg.sender == owner || msg.sender == adrBurner, "[ERROR] : You are not approve for Burn"); _; } modifier onlyMinter { require(msg.sender == owner || msg.sender == adrMinter, "[ERROR] : You are not the Minter Address or Owner"); _; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_adrMinter","type":"address"},{"internalType":"address","name":"_adrBurner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"burnJeton","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_adrBurner","type":"address"}],"name":"changeBurner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_adrMinter","type":"address"}],"name":"changeMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"address","name":"to","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mintJeton","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200398038038062003980833981810160405281019062000037919062000373565b6040518060400160405280600d81526020017f4e4654204a65746f6e20434643000000000000000000000000000000000000008152506040518060400160405280600481526020017f4a434643000000000000000000000000000000000000000000000000000000008152508160029080519060200190620000bb92919062000259565b508060039080519060200190620000d492919062000259565b50620000e56200025460201b60201c565b600081905550505033600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280600d81526020017f4e4654204a65746f6e2043464300000000000000000000000000000000000000815250600990805190602001906200017b92919062000259565b506040518060400160405280600481526020017f4a43464300000000000000000000000000000000000000000000000000000000815250600a9080519060200190620001c992919062000259565b5081600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506200041e565b600090565b8280546200026790620003e9565b90600052602060002090601f0160209004810192826200028b5760008555620002d7565b82601f10620002a657805160ff1916838001178555620002d7565b82800160010185558215620002d7579182015b82811115620002d6578251825591602001919060010190620002b9565b5b509050620002e69190620002ea565b5090565b5b8082111562000305576000816000905550600101620002eb565b5090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200033b826200030e565b9050919050565b6200034d816200032e565b81146200035957600080fd5b50565b6000815190506200036d8162000342565b92915050565b600080604083850312156200038d576200038c62000309565b5b60006200039d858286016200035c565b9250506020620003b0858286016200035c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200040257607f821691505b602082108103620004185762000417620003ba565b5b50919050565b613552806200042e6000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c806370a08231116100c3578063a22cb4651161007c578063a22cb465146103e8578063a6f9dae114610404578063b88d4fde14610420578063c23dc68f1461043c578063c87b56dd1461046c578063e985e9c51461049c5761014d565b806370a08231146102ee57806380b022e81461031e5780638462151c1461033a57806395d89b411461036a57806399a2557a14610388578063a19851b1146103b85761014d565b806323b872dd1161011557806323b872dd1461020a5780632c4d4d181461022657806342842e0e14610242578063581df5231461025e5780635bbb21771461028e5780636352211e146102be5761014d565b806301ffc9a71461015257806306fdde0314610182578063081812fc146101a0578063095ea7b3146101d057806318160ddd146101ec575b600080fd5b61016c6004803603810190610167919061256d565b6104cc565b60405161017991906125b5565b60405180910390f35b61018a61055e565b6040516101979190612669565b60405180910390f35b6101ba60048036038101906101b591906126c1565b6105f0565b6040516101c7919061272f565b60405180910390f35b6101ea60048036038101906101e59190612776565b61066c565b005b6101f46107ad565b60405161020191906127c5565b60405180910390f35b610224600480360381019061021f91906127e0565b6107c4565b005b610240600480360381019061023b9190612833565b610ae6565b005b61025c600480360381019061025791906127e0565b610bba565b005b61027860048036038101906102739190612776565b610bda565b60405161028591906125b5565b60405180910390f35b6102a860048036038101906102a391906129a8565b610cd8565b6040516102b59190612b54565b60405180910390f35b6102d860048036038101906102d391906126c1565b610d99565b6040516102e5919061272f565b60405180910390f35b61030860048036038101906103039190612833565b610dab565b60405161031591906127c5565b60405180910390f35b61033860048036038101906103339190612833565b610e63565b005b610354600480360381019061034f9190612833565b610f37565b6040516103619190612c34565b60405180910390f35b61037261107a565b60405161037f9190612669565b60405180910390f35b6103a2600480360381019061039d9190612c56565b61110c565b6040516103af9190612c34565b60405180910390f35b6103d260048036038101906103cd9190612776565b611318565b6040516103df91906125b5565b60405180910390f35b61040260048036038101906103fd9190612cd5565b61158e565b005b61041e60048036038101906104199190612833565b611705565b005b61043a60048036038101906104359190612dca565b6117d9565b005b610456600480360381019061045191906126c1565b61184c565b6040516104639190612ea2565b60405180910390f35b610486600480360381019061048191906126c1565b6118b6565b6040516104939190612669565b60405180910390f35b6104b660048036038101906104b19190612ebd565b611954565b6040516104c391906125b5565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061052757506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105575750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461056d90612f2c565b80601f016020809104026020016040519081016040528092919081815260200182805461059990612f2c565b80156105e65780601f106105bb576101008083540402835291602001916105e6565b820191906000526020600020905b8154815290600101906020018083116105c957829003601f168201915b5050505050905090565b60006105fb826119e8565b610631576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061067782610d99565b90508073ffffffffffffffffffffffffffffffffffffffff16610698611a47565b73ffffffffffffffffffffffffffffffffffffffff16146106fb576106c4816106bf611a47565b611954565b6106fa576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006107b7611a4f565b6001546000540303905090565b60006107cf82611a54565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610836576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061084284611b20565b915091506108588187610853611a47565b611b42565b6108a45761086d86610868611a47565b611954565b6108a3576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361090a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109178686866001611b86565b801561092257600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506109f0856109cc888887611c88565b7c020000000000000000000000000000000000000000000000000000000017611cb0565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610a765760006001850190506000600460008381526020019081526020016000205403610a74576000548114610a73578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610ade8686866001611cdb565b505050505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6d90612fa9565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610bd5838383604051806020016040528060008152506117d9565b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610c855750600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbb9061303b565b60405180910390fd5b610cce8383611ce1565b6001905092915050565b606060008251905060008167ffffffffffffffff811115610cfc57610cfb612865565b5b604051908082528060200260200182016040528015610d3557816020015b610d226124b2565b815260200190600190039081610d1a5790505b50905060005b828114610d8e57610d65858281518110610d5857610d5761305b565b5b602002602001015161184c565b828281518110610d7857610d7761305b565b5b6020026020010181905250806001019050610d3b565b508092505050919050565b6000610da482611a54565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e12576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eea90612fa9565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60606000806000610f4785610dab565b905060008167ffffffffffffffff811115610f6557610f64612865565b5b604051908082528060200260200182016040528015610f935781602001602082028036833780820191505090505b509050610f9e6124b2565b6000610fa8611a4f565b90505b83861461106c57610fbb81611cff565b9150816040015161106157600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461100657816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361106057808387806001019850815181106110535761105261305b565b5b6020026020010181815250505b5b806001019050610fab565b508195505050505050919050565b60606003805461108990612f2c565b80601f01602080910402602001604051908101604052809291908181526020018280546110b590612f2c565b80156111025780601f106110d757610100808354040283529160200191611102565b820191906000526020600020905b8154815290600101906020018083116110e557829003601f168201915b5050505050905090565b6060818310611147576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611152611d2a565b905061115c611a4f565b85101561116e5761116b611a4f565b94505b8084111561117a578093505b600061118587610dab565b9050848610156111a85760008686039050818110156111a2578091505b506111ad565b600090505b60008167ffffffffffffffff8111156111c9576111c8612865565b5b6040519080825280602002602001820160405280156111f75781602001602082028036833780820191505090505b5090506000820361120e5780945050505050611311565b60006112198861184c565b90506000816040015161122e57816000015190505b60008990505b8881141580156112445750848714155b156113035761125281611cff565b925082604001516112f857600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461129d57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036112f757808488806001019950815181106112ea576112e961305b565b5b6020026020010181815250505b5b806001019050611234565b508583528296505050505050505b9392505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806113c35750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f9906130fc565b60405180910390fd5b813073ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b815260040161143c919061272f565b602060405180830381865afa158015611459573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147d9190613131565b10156114be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b5906131d0565b60405180910390fd5b60003073ffffffffffffffffffffffffffffffffffffffff16638462151c856040518263ffffffff1660e01b81526004016114f9919061272f565b600060405180830381865afa158015611516573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061153f9190613287565b905060005b838110156115825761156f8282815181106115625761156161305b565b5b6020026020010151611d33565b808061157a906132ff565b915050611544565b50600191505092915050565b611596611a47565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115fa576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611607611a47565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116b4611a47565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116f991906125b5565b60405180910390a35050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611795576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178c90612fa9565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6117e48484846107c4565b60008373ffffffffffffffffffffffffffffffffffffffff163b146118465761180f84848484611d41565b611845576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6118546124b2565b61185c6124b2565b611864611a4f565b8310806118785750611874611d2a565b8310155b1561188657809150506118b1565b61188f83611cff565b90508060400151156118a457809150506118b1565b6118ad83611e91565b9150505b919050565b60606118c1826119e8565b6118f7576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611901611eb1565b90506000815103611921576040518060200160405280600081525061194c565b8061192b84611ec8565b60405160200161193c929190613383565b6040516020818303038152906040525b915050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000816119f3611a4f565b11158015611a02575060005482105b8015611a40575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b60008082905080611a63611a4f565b11611ae957600054811015611ae85760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611ae6575b60008103611adc576004600083600190039350838152602001908152602001600020549050611ab2565b8092505050611b1b565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015611c325750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15611c8257611c3f6107ad565b821015611c81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7890613419565b60405180910390fd5b5b50505050565b60008060e883901c905060e8611c9f868684611f22565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b611cfb828260405180602001604052806000815250611f2b565b5050565b611d076124b2565b611d236004600084815260200190815260200160002054611fc8565b9050919050565b60008054905090565b611d3e81600061207e565b50565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611d67611a47565b8786866040518563ffffffff1660e01b8152600401611d89949392919061348e565b6020604051808303816000875af1925050508015611dc557506040513d601f19601f82011682018060405250810190611dc291906134ef565b60015b611e3e573d8060008114611df5576040519150601f19603f3d011682016040523d82523d6000602084013e611dfa565b606091505b506000815103611e36576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b611e996124b2565b611eaa611ea583611a54565b611fc8565b9050919050565b606060405180602001604052806000815250905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b8015611f0e57600183039250600a81066030018353600a81049050611eee565b508181036020830392508083525050919050565b60009392505050565b611f3583836122d0565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611fc357600080549050600083820390505b611f756000868380600101945086611d41565b611fab576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611f62578160005414611fc057600080fd5b50505b505050565b611fd06124b2565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b600061208983611a54565b9050600081905060008061209c86611b20565b915091508415612105576120b881846120b3611a47565b611b42565b612104576120cd836120c8611a47565b611954565b612103576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b612113836000886001611b86565b801561211e57600082555b600160806001901b03600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506121c68361218385600088611c88565b7c02000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000001717611cb0565b600460008881526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000085160361224c576000600187019050600060046000838152602001908152602001600020540361224a576000548114612249578460046000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122b6836000886001611cdb565b600160008154809291906001019190505550505050505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361233c576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008203612376576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123836000848385611b86565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506123fa836123eb6000866000611c88565b6123f4856124a2565b17611cb0565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061241e5780600081905550505061249d6000848385611cdb565b505050565b60006001821460e11b9050919050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61254a81612515565b811461255557600080fd5b50565b60008135905061256781612541565b92915050565b6000602082840312156125835761258261250b565b5b600061259184828501612558565b91505092915050565b60008115159050919050565b6125af8161259a565b82525050565b60006020820190506125ca60008301846125a6565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561260a5780820151818401526020810190506125ef565b83811115612619576000848401525b50505050565b6000601f19601f8301169050919050565b600061263b826125d0565b61264581856125db565b93506126558185602086016125ec565b61265e8161261f565b840191505092915050565b600060208201905081810360008301526126838184612630565b905092915050565b6000819050919050565b61269e8161268b565b81146126a957600080fd5b50565b6000813590506126bb81612695565b92915050565b6000602082840312156126d7576126d661250b565b5b60006126e5848285016126ac565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612719826126ee565b9050919050565b6127298161270e565b82525050565b60006020820190506127446000830184612720565b92915050565b6127538161270e565b811461275e57600080fd5b50565b6000813590506127708161274a565b92915050565b6000806040838503121561278d5761278c61250b565b5b600061279b85828601612761565b92505060206127ac858286016126ac565b9150509250929050565b6127bf8161268b565b82525050565b60006020820190506127da60008301846127b6565b92915050565b6000806000606084860312156127f9576127f861250b565b5b600061280786828701612761565b935050602061281886828701612761565b9250506040612829868287016126ac565b9150509250925092565b6000602082840312156128495761284861250b565b5b600061285784828501612761565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61289d8261261f565b810181811067ffffffffffffffff821117156128bc576128bb612865565b5b80604052505050565b60006128cf612501565b90506128db8282612894565b919050565b600067ffffffffffffffff8211156128fb576128fa612865565b5b602082029050602081019050919050565b600080fd5b600061292461291f846128e0565b6128c5565b905080838252602082019050602084028301858111156129475761294661290c565b5b835b81811015612970578061295c88826126ac565b845260208401935050602081019050612949565b5050509392505050565b600082601f83011261298f5761298e612860565b5b813561299f848260208601612911565b91505092915050565b6000602082840312156129be576129bd61250b565b5b600082013567ffffffffffffffff8111156129dc576129db612510565b5b6129e88482850161297a565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612a268161270e565b82525050565b600067ffffffffffffffff82169050919050565b612a4981612a2c565b82525050565b612a588161259a565b82525050565b600062ffffff82169050919050565b612a7681612a5e565b82525050565b608082016000820151612a926000850182612a1d565b506020820151612aa56020850182612a40565b506040820151612ab86040850182612a4f565b506060820151612acb6060850182612a6d565b50505050565b6000612add8383612a7c565b60808301905092915050565b6000602082019050919050565b6000612b01826129f1565b612b0b81856129fc565b9350612b1683612a0d565b8060005b83811015612b47578151612b2e8882612ad1565b9750612b3983612ae9565b925050600181019050612b1a565b5085935050505092915050565b60006020820190508181036000830152612b6e8184612af6565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612bab8161268b565b82525050565b6000612bbd8383612ba2565b60208301905092915050565b6000602082019050919050565b6000612be182612b76565b612beb8185612b81565b9350612bf683612b92565b8060005b83811015612c27578151612c0e8882612bb1565b9750612c1983612bc9565b925050600181019050612bfa565b5085935050505092915050565b60006020820190508181036000830152612c4e8184612bd6565b905092915050565b600080600060608486031215612c6f57612c6e61250b565b5b6000612c7d86828701612761565b9350506020612c8e868287016126ac565b9250506040612c9f868287016126ac565b9150509250925092565b612cb28161259a565b8114612cbd57600080fd5b50565b600081359050612ccf81612ca9565b92915050565b60008060408385031215612cec57612ceb61250b565b5b6000612cfa85828601612761565b9250506020612d0b85828601612cc0565b9150509250929050565b600080fd5b600067ffffffffffffffff821115612d3557612d34612865565b5b612d3e8261261f565b9050602081019050919050565b82818337600083830152505050565b6000612d6d612d6884612d1a565b6128c5565b905082815260208101848484011115612d8957612d88612d15565b5b612d94848285612d4b565b509392505050565b600082601f830112612db157612db0612860565b5b8135612dc1848260208601612d5a565b91505092915050565b60008060008060808587031215612de457612de361250b565b5b6000612df287828801612761565b9450506020612e0387828801612761565b9350506040612e14878288016126ac565b925050606085013567ffffffffffffffff811115612e3557612e34612510565b5b612e4187828801612d9c565b91505092959194509250565b608082016000820151612e636000850182612a1d565b506020820151612e766020850182612a40565b506040820151612e896040850182612a4f565b506060820151612e9c6060850182612a6d565b50505050565b6000608082019050612eb76000830184612e4d565b92915050565b60008060408385031215612ed457612ed361250b565b5b6000612ee285828601612761565b9250506020612ef385828601612761565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612f4457607f821691505b602082108103612f5757612f56612efd565b5b50919050565b7f5b4552524f525d203a20596f7520617265206e6f74204f776e65720000000000600082015250565b6000612f93601b836125db565b9150612f9e82612f5d565b602082019050919050565b60006020820190508181036000830152612fc281612f86565b9050919050565b7f5b4552524f525d203a20596f7520617265206e6f7420746865204d696e74657260008201527f2041646472657373206f72204f776e6572000000000000000000000000000000602082015250565b60006130256031836125db565b915061303082612fc9565b604082019050919050565b6000602082019050818103600083015261305481613018565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f5b4552524f525d203a20596f7520617265206e6f7420617070726f766520666f60008201527f72204275726e0000000000000000000000000000000000000000000000000000602082015250565b60006130e66026836125db565b91506130f18261308a565b604082019050919050565b60006020820190508181036000830152613115816130d9565b9050919050565b60008151905061312b81612695565b92915050565b6000602082840312156131475761314661250b565b5b60006131558482850161311c565b91505092915050565b7f5b4552524f525d203a20596f7520646f6e74206861766520656e6f756768204a60008201527f65746f6e2120286275726e290000000000000000000000000000000000000000602082015250565b60006131ba602c836125db565b91506131c58261315e565b604082019050919050565b600060208201905081810360008301526131e9816131ad565b9050919050565b60006132036131fe846128e0565b6128c5565b905080838252602082019050602084028301858111156132265761322561290c565b5b835b8181101561324f578061323b888261311c565b845260208401935050602081019050613228565b5050509392505050565b600082601f83011261326e5761326d612860565b5b815161327e8482602086016131f0565b91505092915050565b60006020828403121561329d5761329c61250b565b5b600082015167ffffffffffffffff8111156132bb576132ba612510565b5b6132c784828501613259565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061330a8261268b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361333c5761333b6132d0565b5b600182019050919050565b600081905092915050565b600061335d826125d0565b6133678185613347565b93506133778185602086016125ec565b80840191505092915050565b600061338f8285613352565b915061339b8284613352565b91508190509392505050565b7f5b4552524f525d203a20596f752063616e2774207472616e73666572204a657460008201527f6f6e730000000000000000000000000000000000000000000000000000000000602082015250565b60006134036023836125db565b915061340e826133a7565b604082019050919050565b60006020820190508181036000830152613432816133f6565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061346082613439565b61346a8185613444565b935061347a8185602086016125ec565b6134838161261f565b840191505092915050565b60006080820190506134a36000830187612720565b6134b06020830186612720565b6134bd60408301856127b6565b81810360608301526134cf8184613455565b905095945050505050565b6000815190506134e981612541565b92915050565b6000602082840312156135055761350461250b565b5b6000613513848285016134da565b9150509291505056fea26469706673582212209e74c0e8a6c6ec1ec1c9833bbc0e606da40ca17a4446f44f44c73de52d26594f64736f6c634300080e0033000000000000000000000000e2850f74c8cc1f15c2536e3ea6cec220f1dd6854000000000000000000000000e2850f74c8cc1f15c2536e3ea6cec220f1dd6854
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061014d5760003560e01c806370a08231116100c3578063a22cb4651161007c578063a22cb465146103e8578063a6f9dae114610404578063b88d4fde14610420578063c23dc68f1461043c578063c87b56dd1461046c578063e985e9c51461049c5761014d565b806370a08231146102ee57806380b022e81461031e5780638462151c1461033a57806395d89b411461036a57806399a2557a14610388578063a19851b1146103b85761014d565b806323b872dd1161011557806323b872dd1461020a5780632c4d4d181461022657806342842e0e14610242578063581df5231461025e5780635bbb21771461028e5780636352211e146102be5761014d565b806301ffc9a71461015257806306fdde0314610182578063081812fc146101a0578063095ea7b3146101d057806318160ddd146101ec575b600080fd5b61016c6004803603810190610167919061256d565b6104cc565b60405161017991906125b5565b60405180910390f35b61018a61055e565b6040516101979190612669565b60405180910390f35b6101ba60048036038101906101b591906126c1565b6105f0565b6040516101c7919061272f565b60405180910390f35b6101ea60048036038101906101e59190612776565b61066c565b005b6101f46107ad565b60405161020191906127c5565b60405180910390f35b610224600480360381019061021f91906127e0565b6107c4565b005b610240600480360381019061023b9190612833565b610ae6565b005b61025c600480360381019061025791906127e0565b610bba565b005b61027860048036038101906102739190612776565b610bda565b60405161028591906125b5565b60405180910390f35b6102a860048036038101906102a391906129a8565b610cd8565b6040516102b59190612b54565b60405180910390f35b6102d860048036038101906102d391906126c1565b610d99565b6040516102e5919061272f565b60405180910390f35b61030860048036038101906103039190612833565b610dab565b60405161031591906127c5565b60405180910390f35b61033860048036038101906103339190612833565b610e63565b005b610354600480360381019061034f9190612833565b610f37565b6040516103619190612c34565b60405180910390f35b61037261107a565b60405161037f9190612669565b60405180910390f35b6103a2600480360381019061039d9190612c56565b61110c565b6040516103af9190612c34565b60405180910390f35b6103d260048036038101906103cd9190612776565b611318565b6040516103df91906125b5565b60405180910390f35b61040260048036038101906103fd9190612cd5565b61158e565b005b61041e60048036038101906104199190612833565b611705565b005b61043a60048036038101906104359190612dca565b6117d9565b005b610456600480360381019061045191906126c1565b61184c565b6040516104639190612ea2565b60405180910390f35b610486600480360381019061048191906126c1565b6118b6565b6040516104939190612669565b60405180910390f35b6104b660048036038101906104b19190612ebd565b611954565b6040516104c391906125b5565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061052757506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105575750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461056d90612f2c565b80601f016020809104026020016040519081016040528092919081815260200182805461059990612f2c565b80156105e65780601f106105bb576101008083540402835291602001916105e6565b820191906000526020600020905b8154815290600101906020018083116105c957829003601f168201915b5050505050905090565b60006105fb826119e8565b610631576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061067782610d99565b90508073ffffffffffffffffffffffffffffffffffffffff16610698611a47565b73ffffffffffffffffffffffffffffffffffffffff16146106fb576106c4816106bf611a47565b611954565b6106fa576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006107b7611a4f565b6001546000540303905090565b60006107cf82611a54565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610836576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061084284611b20565b915091506108588187610853611a47565b611b42565b6108a45761086d86610868611a47565b611954565b6108a3576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361090a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109178686866001611b86565b801561092257600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506109f0856109cc888887611c88565b7c020000000000000000000000000000000000000000000000000000000017611cb0565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610a765760006001850190506000600460008381526020019081526020016000205403610a74576000548114610a73578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610ade8686866001611cdb565b505050505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6d90612fa9565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610bd5838383604051806020016040528060008152506117d9565b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610c855750600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbb9061303b565b60405180910390fd5b610cce8383611ce1565b6001905092915050565b606060008251905060008167ffffffffffffffff811115610cfc57610cfb612865565b5b604051908082528060200260200182016040528015610d3557816020015b610d226124b2565b815260200190600190039081610d1a5790505b50905060005b828114610d8e57610d65858281518110610d5857610d5761305b565b5b602002602001015161184c565b828281518110610d7857610d7761305b565b5b6020026020010181905250806001019050610d3b565b508092505050919050565b6000610da482611a54565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e12576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eea90612fa9565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60606000806000610f4785610dab565b905060008167ffffffffffffffff811115610f6557610f64612865565b5b604051908082528060200260200182016040528015610f935781602001602082028036833780820191505090505b509050610f9e6124b2565b6000610fa8611a4f565b90505b83861461106c57610fbb81611cff565b9150816040015161106157600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461100657816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361106057808387806001019850815181106110535761105261305b565b5b6020026020010181815250505b5b806001019050610fab565b508195505050505050919050565b60606003805461108990612f2c565b80601f01602080910402602001604051908101604052809291908181526020018280546110b590612f2c565b80156111025780601f106110d757610100808354040283529160200191611102565b820191906000526020600020905b8154815290600101906020018083116110e557829003601f168201915b5050505050905090565b6060818310611147576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611152611d2a565b905061115c611a4f565b85101561116e5761116b611a4f565b94505b8084111561117a578093505b600061118587610dab565b9050848610156111a85760008686039050818110156111a2578091505b506111ad565b600090505b60008167ffffffffffffffff8111156111c9576111c8612865565b5b6040519080825280602002602001820160405280156111f75781602001602082028036833780820191505090505b5090506000820361120e5780945050505050611311565b60006112198861184c565b90506000816040015161122e57816000015190505b60008990505b8881141580156112445750848714155b156113035761125281611cff565b925082604001516112f857600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461129d57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036112f757808488806001019950815181106112ea576112e961305b565b5b6020026020010181815250505b5b806001019050611234565b508583528296505050505050505b9392505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806113c35750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f9906130fc565b60405180910390fd5b813073ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b815260040161143c919061272f565b602060405180830381865afa158015611459573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147d9190613131565b10156114be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b5906131d0565b60405180910390fd5b60003073ffffffffffffffffffffffffffffffffffffffff16638462151c856040518263ffffffff1660e01b81526004016114f9919061272f565b600060405180830381865afa158015611516573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061153f9190613287565b905060005b838110156115825761156f8282815181106115625761156161305b565b5b6020026020010151611d33565b808061157a906132ff565b915050611544565b50600191505092915050565b611596611a47565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115fa576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611607611a47565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116b4611a47565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116f991906125b5565b60405180910390a35050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611795576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178c90612fa9565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6117e48484846107c4565b60008373ffffffffffffffffffffffffffffffffffffffff163b146118465761180f84848484611d41565b611845576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6118546124b2565b61185c6124b2565b611864611a4f565b8310806118785750611874611d2a565b8310155b1561188657809150506118b1565b61188f83611cff565b90508060400151156118a457809150506118b1565b6118ad83611e91565b9150505b919050565b60606118c1826119e8565b6118f7576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611901611eb1565b90506000815103611921576040518060200160405280600081525061194c565b8061192b84611ec8565b60405160200161193c929190613383565b6040516020818303038152906040525b915050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000816119f3611a4f565b11158015611a02575060005482105b8015611a40575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b60008082905080611a63611a4f565b11611ae957600054811015611ae85760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611ae6575b60008103611adc576004600083600190039350838152602001908152602001600020549050611ab2565b8092505050611b1b565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015611c325750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15611c8257611c3f6107ad565b821015611c81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7890613419565b60405180910390fd5b5b50505050565b60008060e883901c905060e8611c9f868684611f22565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b611cfb828260405180602001604052806000815250611f2b565b5050565b611d076124b2565b611d236004600084815260200190815260200160002054611fc8565b9050919050565b60008054905090565b611d3e81600061207e565b50565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611d67611a47565b8786866040518563ffffffff1660e01b8152600401611d89949392919061348e565b6020604051808303816000875af1925050508015611dc557506040513d601f19601f82011682018060405250810190611dc291906134ef565b60015b611e3e573d8060008114611df5576040519150601f19603f3d011682016040523d82523d6000602084013e611dfa565b606091505b506000815103611e36576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b611e996124b2565b611eaa611ea583611a54565b611fc8565b9050919050565b606060405180602001604052806000815250905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b8015611f0e57600183039250600a81066030018353600a81049050611eee565b508181036020830392508083525050919050565b60009392505050565b611f3583836122d0565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611fc357600080549050600083820390505b611f756000868380600101945086611d41565b611fab576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611f62578160005414611fc057600080fd5b50505b505050565b611fd06124b2565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b600061208983611a54565b9050600081905060008061209c86611b20565b915091508415612105576120b881846120b3611a47565b611b42565b612104576120cd836120c8611a47565b611954565b612103576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b612113836000886001611b86565b801561211e57600082555b600160806001901b03600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506121c68361218385600088611c88565b7c02000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000001717611cb0565b600460008881526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000085160361224c576000600187019050600060046000838152602001908152602001600020540361224a576000548114612249578460046000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122b6836000886001611cdb565b600160008154809291906001019190505550505050505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361233c576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008203612376576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123836000848385611b86565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506123fa836123eb6000866000611c88565b6123f4856124a2565b17611cb0565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061241e5780600081905550505061249d6000848385611cdb565b505050565b60006001821460e11b9050919050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61254a81612515565b811461255557600080fd5b50565b60008135905061256781612541565b92915050565b6000602082840312156125835761258261250b565b5b600061259184828501612558565b91505092915050565b60008115159050919050565b6125af8161259a565b82525050565b60006020820190506125ca60008301846125a6565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561260a5780820151818401526020810190506125ef565b83811115612619576000848401525b50505050565b6000601f19601f8301169050919050565b600061263b826125d0565b61264581856125db565b93506126558185602086016125ec565b61265e8161261f565b840191505092915050565b600060208201905081810360008301526126838184612630565b905092915050565b6000819050919050565b61269e8161268b565b81146126a957600080fd5b50565b6000813590506126bb81612695565b92915050565b6000602082840312156126d7576126d661250b565b5b60006126e5848285016126ac565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612719826126ee565b9050919050565b6127298161270e565b82525050565b60006020820190506127446000830184612720565b92915050565b6127538161270e565b811461275e57600080fd5b50565b6000813590506127708161274a565b92915050565b6000806040838503121561278d5761278c61250b565b5b600061279b85828601612761565b92505060206127ac858286016126ac565b9150509250929050565b6127bf8161268b565b82525050565b60006020820190506127da60008301846127b6565b92915050565b6000806000606084860312156127f9576127f861250b565b5b600061280786828701612761565b935050602061281886828701612761565b9250506040612829868287016126ac565b9150509250925092565b6000602082840312156128495761284861250b565b5b600061285784828501612761565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61289d8261261f565b810181811067ffffffffffffffff821117156128bc576128bb612865565b5b80604052505050565b60006128cf612501565b90506128db8282612894565b919050565b600067ffffffffffffffff8211156128fb576128fa612865565b5b602082029050602081019050919050565b600080fd5b600061292461291f846128e0565b6128c5565b905080838252602082019050602084028301858111156129475761294661290c565b5b835b81811015612970578061295c88826126ac565b845260208401935050602081019050612949565b5050509392505050565b600082601f83011261298f5761298e612860565b5b813561299f848260208601612911565b91505092915050565b6000602082840312156129be576129bd61250b565b5b600082013567ffffffffffffffff8111156129dc576129db612510565b5b6129e88482850161297a565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612a268161270e565b82525050565b600067ffffffffffffffff82169050919050565b612a4981612a2c565b82525050565b612a588161259a565b82525050565b600062ffffff82169050919050565b612a7681612a5e565b82525050565b608082016000820151612a926000850182612a1d565b506020820151612aa56020850182612a40565b506040820151612ab86040850182612a4f565b506060820151612acb6060850182612a6d565b50505050565b6000612add8383612a7c565b60808301905092915050565b6000602082019050919050565b6000612b01826129f1565b612b0b81856129fc565b9350612b1683612a0d565b8060005b83811015612b47578151612b2e8882612ad1565b9750612b3983612ae9565b925050600181019050612b1a565b5085935050505092915050565b60006020820190508181036000830152612b6e8184612af6565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612bab8161268b565b82525050565b6000612bbd8383612ba2565b60208301905092915050565b6000602082019050919050565b6000612be182612b76565b612beb8185612b81565b9350612bf683612b92565b8060005b83811015612c27578151612c0e8882612bb1565b9750612c1983612bc9565b925050600181019050612bfa565b5085935050505092915050565b60006020820190508181036000830152612c4e8184612bd6565b905092915050565b600080600060608486031215612c6f57612c6e61250b565b5b6000612c7d86828701612761565b9350506020612c8e868287016126ac565b9250506040612c9f868287016126ac565b9150509250925092565b612cb28161259a565b8114612cbd57600080fd5b50565b600081359050612ccf81612ca9565b92915050565b60008060408385031215612cec57612ceb61250b565b5b6000612cfa85828601612761565b9250506020612d0b85828601612cc0565b9150509250929050565b600080fd5b600067ffffffffffffffff821115612d3557612d34612865565b5b612d3e8261261f565b9050602081019050919050565b82818337600083830152505050565b6000612d6d612d6884612d1a565b6128c5565b905082815260208101848484011115612d8957612d88612d15565b5b612d94848285612d4b565b509392505050565b600082601f830112612db157612db0612860565b5b8135612dc1848260208601612d5a565b91505092915050565b60008060008060808587031215612de457612de361250b565b5b6000612df287828801612761565b9450506020612e0387828801612761565b9350506040612e14878288016126ac565b925050606085013567ffffffffffffffff811115612e3557612e34612510565b5b612e4187828801612d9c565b91505092959194509250565b608082016000820151612e636000850182612a1d565b506020820151612e766020850182612a40565b506040820151612e896040850182612a4f565b506060820151612e9c6060850182612a6d565b50505050565b6000608082019050612eb76000830184612e4d565b92915050565b60008060408385031215612ed457612ed361250b565b5b6000612ee285828601612761565b9250506020612ef385828601612761565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612f4457607f821691505b602082108103612f5757612f56612efd565b5b50919050565b7f5b4552524f525d203a20596f7520617265206e6f74204f776e65720000000000600082015250565b6000612f93601b836125db565b9150612f9e82612f5d565b602082019050919050565b60006020820190508181036000830152612fc281612f86565b9050919050565b7f5b4552524f525d203a20596f7520617265206e6f7420746865204d696e74657260008201527f2041646472657373206f72204f776e6572000000000000000000000000000000602082015250565b60006130256031836125db565b915061303082612fc9565b604082019050919050565b6000602082019050818103600083015261305481613018565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f5b4552524f525d203a20596f7520617265206e6f7420617070726f766520666f60008201527f72204275726e0000000000000000000000000000000000000000000000000000602082015250565b60006130e66026836125db565b91506130f18261308a565b604082019050919050565b60006020820190508181036000830152613115816130d9565b9050919050565b60008151905061312b81612695565b92915050565b6000602082840312156131475761314661250b565b5b60006131558482850161311c565b91505092915050565b7f5b4552524f525d203a20596f7520646f6e74206861766520656e6f756768204a60008201527f65746f6e2120286275726e290000000000000000000000000000000000000000602082015250565b60006131ba602c836125db565b91506131c58261315e565b604082019050919050565b600060208201905081810360008301526131e9816131ad565b9050919050565b60006132036131fe846128e0565b6128c5565b905080838252602082019050602084028301858111156132265761322561290c565b5b835b8181101561324f578061323b888261311c565b845260208401935050602081019050613228565b5050509392505050565b600082601f83011261326e5761326d612860565b5b815161327e8482602086016131f0565b91505092915050565b60006020828403121561329d5761329c61250b565b5b600082015167ffffffffffffffff8111156132bb576132ba612510565b5b6132c784828501613259565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061330a8261268b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361333c5761333b6132d0565b5b600182019050919050565b600081905092915050565b600061335d826125d0565b6133678185613347565b93506133778185602086016125ec565b80840191505092915050565b600061338f8285613352565b915061339b8284613352565b91508190509392505050565b7f5b4552524f525d203a20596f752063616e2774207472616e73666572204a657460008201527f6f6e730000000000000000000000000000000000000000000000000000000000602082015250565b60006134036023836125db565b915061340e826133a7565b604082019050919050565b60006020820190508181036000830152613432816133f6565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061346082613439565b61346a8185613444565b935061347a8185602086016125ec565b6134838161261f565b840191505092915050565b60006080820190506134a36000830187612720565b6134b06020830186612720565b6134bd60408301856127b6565b81810360608301526134cf8184613455565b905095945050505050565b6000815190506134e981612541565b92915050565b6000602082840312156135055761350461250b565b5b6000613513848285016134da565b9150509291505056fea26469706673582212209e74c0e8a6c6ec1ec1c9833bbc0e606da40ca17a4446f44f44c73de52d26594f64736f6c634300080e0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000e2850f74c8cc1f15c2536e3ea6cec220f1dd6854000000000000000000000000e2850f74c8cc1f15c2536e3ea6cec220f1dd6854
-----Decoded View---------------
Arg [0] : _adrMinter (address): 0xe2850f74c8cc1f15c2536e3ea6cec220f1dd6854
Arg [1] : _adrBurner (address): 0xe2850f74c8cc1f15c2536e3ea6cec220f1dd6854
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000e2850f74c8cc1f15c2536e3ea6cec220f1dd6854
Arg [1] : 000000000000000000000000e2850f74c8cc1f15c2536e3ea6cec220f1dd6854
Deployed ByteCode Sourcemap
53764:2114:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14590:615;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20237:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22183:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21731:386;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13644:315;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31448:2800;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54391:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23073:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54504:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48814:468;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20026:144;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15269:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54278:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52626:892;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20406:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49672:2505;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54663:461;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22459:308;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54178:92;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23329:399;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48235:420;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20581:318;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22838:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14590:615;14675:4;14990:10;14975:25;;:11;:25;;;;:102;;;;15067:10;15052:25;;:11;:25;;;;14975:102;:179;;;;15144:10;15129:25;;:11;:25;;;;14975:179;14955:199;;14590:615;;;:::o;20237:100::-;20291:13;20324:5;20317:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20237:100;:::o;22183:204::-;22251:7;22276:16;22284:7;22276;:16::i;:::-;22271:64;;22301:34;;;;;;;;;;;;;;22271:64;22355:15;:24;22371:7;22355:24;;;;;;;;;;;;;;;;;;;;;22348:31;;22183:204;;;:::o;21731:386::-;21804:13;21820:16;21828:7;21820;:16::i;:::-;21804:32;;21876:5;21853:28;;:19;:17;:19::i;:::-;:28;;;21849:175;;21901:44;21918:5;21925:19;:17;:19::i;:::-;21901:16;:44::i;:::-;21896:128;;21973:35;;;;;;;;;;;;;;21896:128;21849:175;22063:2;22036:15;:24;22052:7;22036:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;22101:7;22097:2;22081:28;;22090:5;22081:28;;;;;;;;;;;;21793:324;21731:386;;:::o;13644:315::-;13697:7;13925:15;:13;:15::i;:::-;13910:12;;13894:13;;:28;:46;13887:53;;13644:315;:::o;31448:2800::-;31582:27;31612;31631:7;31612:18;:27::i;:::-;31582:57;;31697:4;31656:45;;31672:19;31656:45;;;31652:86;;31710:28;;;;;;;;;;;;;;31652:86;31752:27;31781:23;31808:28;31828:7;31808:19;:28::i;:::-;31751:85;;;;31936:62;31955:15;31972:4;31978:19;:17;:19::i;:::-;31936:18;:62::i;:::-;31931:174;;32018:43;32035:4;32041:19;:17;:19::i;:::-;32018:16;:43::i;:::-;32013:92;;32070:35;;;;;;;;;;;;;;32013:92;31931:174;32136:1;32122:16;;:2;:16;;;32118:52;;32147:23;;;;;;;;;;;;;;32118:52;32183:43;32205:4;32211:2;32215:7;32224:1;32183:21;:43::i;:::-;32319:15;32316:160;;;32459:1;32438:19;32431:30;32316:160;32854:18;:24;32873:4;32854:24;;;;;;;;;;;;;;;;32852:26;;;;;;;;;;;;32923:18;:22;32942:2;32923:22;;;;;;;;;;;;;;;;32921:24;;;;;;;;;;;33245:145;33282:2;33330:45;33345:4;33351:2;33355:19;33330:14;:45::i;:::-;10872:8;33303:72;33245:18;:145::i;:::-;33216:17;:26;33234:7;33216:26;;;;;;;;;;;:174;;;;33560:1;10872:8;33510:19;:46;:51;33506:626;;33582:19;33614:1;33604:7;:11;33582:33;;33771:1;33737:17;:30;33755:11;33737:30;;;;;;;;;;;;:35;33733:384;;33875:13;;33860:11;:28;33856:242;;34055:19;34022:17;:30;34040:11;34022:30;;;;;;;;;;;:52;;;;33856:242;33733:384;33563:569;33506:626;34179:7;34175:2;34160:27;;34169:4;34160:27;;;;;;;;;;;;34198:42;34219:4;34225:2;34229:7;34238:1;34198:20;:42::i;:::-;31571:2677;;;31448:2800;;;:::o;54391:105::-;55505:5;;;;;;;;;;;55491:19;;:10;:19;;;55483:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;54478:10:::1;54466:9;;:22;;;;;;;;;;;;;;;;;;54391:105:::0;:::o;23073:185::-;23211:39;23228:4;23234:2;23238:7;23211:39;;;;;;;;;;;;:16;:39::i;:::-;23073:185;;;:::o;54504:151::-;54579:4;55771:5;;;;;;;;;;;55757:19;;:10;:19;;;:46;;;;55794:9;;;;;;;;;;;55780:23;;:10;:23;;;55757:46;55749:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;54601:24:::1;54611:2;54615:9;54601;:24::i;:::-;54643:4;54636:11;;54504:151:::0;;;;:::o;48814:468::-;48903:23;48964:22;48989:8;:15;48964:40;;49019:34;49077:14;49056:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;49019:73;;49112:9;49107:125;49128:14;49123:1;:19;49107:125;;49184:32;49204:8;49213:1;49204:11;;;;;;;;:::i;:::-;;;;;;;;49184:19;:32::i;:::-;49168:10;49179:1;49168:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;49144:3;;;;;49107:125;;;;49253:10;49246:17;;;;48814:468;;;:::o;20026:144::-;20090:7;20133:27;20152:7;20133:18;:27::i;:::-;20110:52;;20026:144;;;:::o;15269:224::-;15333:7;15374:1;15357:19;;:5;:19;;;15353:60;;15385:28;;;;;;;;;;;;;;15353:60;9824:13;15431:18;:25;15450:5;15431:25;;;;;;;;;;;;;;;;:54;15424:61;;15269:224;;;:::o;54278:105::-;55505:5;;;;;;;;;;;55491:19;;:10;:19;;;55483:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;54365:10:::1;54353:9;;:22;;;;;;;;;;;;;;;;;;54278:105:::0;:::o;52626:892::-;52696:16;52750:19;52784:25;52824:22;52849:16;52859:5;52849:9;:16::i;:::-;52824:41;;52880:25;52922:14;52908:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52880:57;;52952:31;;:::i;:::-;53003:9;53015:15;:13;:15::i;:::-;53003:27;;52998:472;53047:14;53032:11;:29;52998:472;;53099:15;53112:1;53099:12;:15::i;:::-;53087:27;;53137:9;:16;;;53178:8;53133:73;53254:1;53228:28;;:9;:14;;;:28;;;53224:111;;53301:9;:14;;;53281:34;;53224:111;53378:5;53357:26;;:17;:26;;;53353:102;;53434:1;53408:8;53417:13;;;;;;53408:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;53353:102;52998:472;53063:3;;;;;52998:472;;;;53491:8;53484:15;;;;;;;52626:892;;;:::o;20406:104::-;20462:13;20495:7;20488:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20406:104;:::o;49672:2505::-;49807:16;49874:4;49865:5;:13;49861:45;;49887:19;;;;;;;;;;;;;;49861:45;49921:19;49955:17;49975:14;:12;:14::i;:::-;49955:34;;50075:15;:13;:15::i;:::-;50067:5;:23;50063:87;;;50119:15;:13;:15::i;:::-;50111:23;;50063:87;50226:9;50219:4;:16;50215:73;;;50263:9;50256:16;;50215:73;50302:25;50330:16;50340:5;50330:9;:16::i;:::-;50302:44;;50524:4;50516:5;:12;50512:278;;;50549:19;50578:5;50571:4;:12;50549:34;;50620:17;50606:11;:31;50602:111;;;50682:11;50662:31;;50602:111;50530:198;50512:278;;;50773:1;50753:21;;50512:278;50804:25;50846:17;50832:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50804:60;;50904:1;50883:17;:22;50879:78;;50933:8;50926:15;;;;;;;;50879:78;51101:31;51135:26;51155:5;51135:19;:26::i;:::-;51101:60;;51176:25;51421:9;:16;;;51416:92;;51478:9;:14;;;51458:34;;51416:92;51527:9;51539:5;51527:17;;51522:478;51551:4;51546:1;:9;;:45;;;;;51574:17;51559:11;:32;;51546:45;51522:478;;;51629:15;51642:1;51629:12;:15::i;:::-;51617:27;;51667:9;:16;;;51708:8;51663:73;51784:1;51758:28;;:9;:14;;;:28;;;51754:111;;51831:9;:14;;;51811:34;;51754:111;51908:5;51887:26;;:17;:26;;;51883:102;;51964:1;51938:8;51947:13;;;;;;51938:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;51883:102;51522:478;51593:3;;;;;51522:478;;;;52102:11;52092:8;52085:29;52150:8;52143:15;;;;;;;;49672:2505;;;;;;:::o;54663:461::-;54744:4;55619:5;;;;;;;;;;;55605:19;;:10;:19;;;:46;;;;55642:9;;;;;;;;;;;55628:23;;:10;:23;;;55605:46;55597:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;54829:9:::1;54799:4;54774:41;;;54816:8;54774:51;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:64;;54766:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;54908:23;54959:4;54934:45;;;54980:8;54934:55;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54908:81;;55006:6;55002:91;55022:9;55018:1;:13;55002:91;;;55062:19;55068:9;55078:1;55068:12;;;;;;;;:::i;:::-;;;;;;;;55062:5;:19::i;:::-;55033:3;;;;;:::i;:::-;;;;55002:91;;;;55112:4;55105:11;;;54663:461:::0;;;;:::o;22459:308::-;22570:19;:17;:19::i;:::-;22558:31;;:8;:31;;;22554:61;;22598:17;;;;;;;;;;;;;;22554:61;22680:8;22628:18;:39;22647:19;:17;:19::i;:::-;22628:39;;;;;;;;;;;;;;;:49;22668:8;22628:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;22740:8;22704:55;;22719:19;:17;:19::i;:::-;22704:55;;;22750:8;22704:55;;;;;;:::i;:::-;;;;;;;;22459:308;;:::o;54178:92::-;55505:5;;;;;;;;;;;55491:19;;:10;:19;;;55483:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;54256:6:::1;54248:5;;:14;;;;;;;;;;;;;;;;;;54178:92:::0;:::o;23329:399::-;23496:31;23509:4;23515:2;23519:7;23496:12;:31::i;:::-;23560:1;23542:2;:14;;;:19;23538:183;;23581:56;23612:4;23618:2;23622:7;23631:5;23581:30;:56::i;:::-;23576:145;;23665:40;;;;;;;;;;;;;;23576:145;23538:183;23329:399;;;;:::o;48235:420::-;48311:21;;:::i;:::-;48345:31;;:::i;:::-;48401:15;:13;:15::i;:::-;48391:7;:25;:54;;;;48431:14;:12;:14::i;:::-;48420:7;:25;;48391:54;48387:103;;;48469:9;48462:16;;;;;48387:103;48512:21;48525:7;48512:12;:21::i;:::-;48500:33;;48548:9;:16;;;48544:65;;;48588:9;48581:16;;;;;48544:65;48626:21;48639:7;48626:12;:21::i;:::-;48619:28;;;48235:420;;;;:::o;20581:318::-;20654:13;20685:16;20693:7;20685;:16::i;:::-;20680:59;;20710:29;;;;;;;;;;;;;;20680:59;20752:21;20776:10;:8;:10::i;:::-;20752:34;;20829:1;20810:7;20804:21;:26;:87;;;;;;;;;;;;;;;;;20857:7;20866:18;20876:7;20866:9;:18::i;:::-;20840:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;20804:87;20797:94;;;20581:318;;;:::o;22838:164::-;22935:4;22959:18;:25;22978:5;22959:25;;;;;;;;;;;;;;;:35;22985:8;22959:35;;;;;;;;;;;;;;;;;;;;;;;;;22952:42;;22838:164;;;;:::o;23983:273::-;24040:4;24096:7;24077:15;:13;:15::i;:::-;:26;;:66;;;;;24130:13;;24120:7;:23;24077:66;:152;;;;;24228:1;10594:8;24181:17;:26;24199:7;24181:26;;;;;;;;;;;;:43;:48;24077:152;24057:172;;23983:273;;;:::o;42544:105::-;42604:7;42631:10;42624:17;;42544:105;:::o;13168:92::-;13224:7;13168:92;:::o;16943:1129::-;17010:7;17030:12;17045:7;17030:22;;17113:4;17094:15;:13;:15::i;:::-;:23;17090:915;;17147:13;;17140:4;:20;17136:869;;;17185:14;17202:17;:23;17220:4;17202:23;;;;;;;;;;;;17185:40;;17318:1;10594:8;17291:6;:23;:28;17287:699;;17810:113;17827:1;17817:6;:11;17810:113;;17870:17;:25;17888:6;;;;;;;17870:25;;;;;;;;;;;;17861:34;;17810:113;;;17956:6;17949:13;;;;;;17287:699;17162:843;17136:869;17090:915;18033:31;;;;;;;;;;;;;;16943:1129;;;;:::o;29784:652::-;29879:27;29908:23;29949:53;30005:15;29949:71;;30191:7;30185:4;30178:21;30226:22;30220:4;30213:36;30302:4;30296;30286:21;30263:44;;30398:19;30392:26;30373:45;;30129:300;29784:652;;;:::o;30549:645::-;30691:11;30853:15;30847:4;30843:26;30835:34;;31012:15;31001:9;30997:31;30984:44;;31159:15;31148:9;31145:30;31138:4;31127:9;31124:19;31121:55;31111:65;;30549:645;;;;;:::o;55132:315::-;55289:9;;;;;;;;;;;55275:23;;:10;:23;;;;:50;;;;;55316:9;;;;;;;;;;;55302:23;;:10;:23;;;;55275:50;55272:168;;;55375:13;:11;:13::i;:::-;55359:12;:29;;55351:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;55272:168;55132:315;;;;:::o;39689:309::-;39824:7;39844:16;10995:3;39870:19;:40;;39844:67;;10995:3;39937:31;39948:4;39954:2;39958:9;39937:10;:31::i;:::-;39929:40;;:61;;39922:68;;;39689:309;;;;;:::o;19517:447::-;19597:14;19765:15;19758:5;19754:27;19745:36;;19939:5;19925:11;19901:22;19897:40;19894:51;19887:5;19884:62;19874:72;;19517:447;;;;:::o;42195:158::-;;;;;:::o;24340:104::-;24409:27;24419:2;24423:8;24409:27;;;;;;;;;;;;:9;:27::i;:::-;24340:104;;:::o;18620:153::-;18680:21;;:::i;:::-;18721:44;18740:17;:24;18758:5;18740:24;;;;;;;;;;;;18721:18;:44::i;:::-;18714:51;;18620:153;;;:::o;13339:95::-;13386:7;13413:13;;13406:20;;13339:95;:::o;34326:89::-;34386:21;34392:7;34401:5;34386;:21::i;:::-;34326:89;:::o;38199:716::-;38362:4;38408:2;38383:45;;;38429:19;:17;:19::i;:::-;38450:4;38456:7;38465:5;38383:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38379:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38683:1;38666:6;:13;:18;38662:235;;38712:40;;;;;;;;;;;;;;38662:235;38855:6;38849:13;38840:6;38836:2;38832:15;38825:38;38379:529;38552:54;;;38542:64;;;:6;:64;;;;38535:71;;;38199:716;;;;;;:::o;19276:158::-;19338:21;;:::i;:::-;19379:47;19398:27;19417:7;19398:18;:27::i;:::-;19379:18;:47::i;:::-;19372:54;;19276:158;;;:::o;21151:94::-;21202:13;21228:9;;;;;;;;;;;;;;21151:94;:::o;42755:1960::-;42812:17;43231:3;43224:4;43218:11;43214:21;43207:28;;43322:3;43316:4;43309:17;43428:3;43884:5;44014:1;44009:3;44005:11;43998:18;;44151:2;44145:4;44141:13;44137:2;44133:22;44128:3;44120:36;44192:2;44186:4;44182:13;44174:21;;43776:697;44211:4;43776:697;;;44402:1;44397:3;44393:11;44386:18;;44453:2;44447:4;44443:13;44439:2;44435:22;44430:3;44422:36;44306:2;44300:4;44296:13;44288:21;;43776:697;;;43780:430;44512:3;44507;44503:13;44627:2;44622:3;44618:12;44611:19;;44690:6;44685:3;44678:19;42851:1857;;42755:1960;;;:::o;40574:147::-;40711:6;40574:147;;;;;:::o;24860:681::-;24983:19;24989:2;24993:8;24983:5;:19::i;:::-;25062:1;25044:2;:14;;;:19;25040:483;;25084:11;25098:13;;25084:27;;25130:13;25152:8;25146:3;:14;25130:30;;25179:233;25210:62;25249:1;25253:2;25257:7;;;;;;25266:5;25210:30;:62::i;:::-;25205:167;;25308:40;;;;;;;;;;;;;;25205:167;25407:3;25399:5;:11;25179:233;;25494:3;25477:13;;:20;25473:34;;25499:8;;;25473:34;25065:458;;25040:483;24860:681;;;:::o;18166:363::-;18232:31;;:::i;:::-;18309:6;18276:9;:14;;:41;;;;;;;;;;;10478:3;18362:6;:32;;18328:9;:24;;:67;;;;;;;;;;;18452:1;10594:8;18425:6;:23;:28;;18406:9;:16;;:47;;;;;;;;;;;10995:3;18493:6;:27;;18464:9;:19;;:57;;;;;;;;;;;18166:363;;;:::o;34644:3063::-;34724:27;34754;34773:7;34754:18;:27::i;:::-;34724:57;;34794:12;34825:19;34794:52;;34860:27;34889:23;34916:28;34936:7;34916:19;:28::i;:::-;34859:85;;;;34961:13;34957:310;;;35082:62;35101:15;35118:4;35124:19;:17;:19::i;:::-;35082:18;:62::i;:::-;35077:178;;35168:43;35185:4;35191:19;:17;:19::i;:::-;35168:16;:43::i;:::-;35163:92;;35220:35;;;;;;;;;;;;;;35163:92;35077:178;34957:310;35279:51;35301:4;35315:1;35319:7;35328:1;35279:21;:51::i;:::-;35423:15;35420:160;;;35563:1;35542:19;35535:30;35420:160;36239:1;10087:3;36210:1;:25;;36209:31;36181:18;:24;36200:4;36181:24;;;;;;;;;;;;;;;;:59;;;;;;;;;;;36507:174;36544:4;36613:53;36628:4;36642:1;36646:19;36613:14;:53::i;:::-;10872:8;10594;36568:41;36567:99;36507:18;:174::i;:::-;36478:17;:26;36496:7;36478:26;;;;;;;;;;;:203;;;;36851:1;10872:8;36801:19;:46;:51;36797:626;;36873:19;36905:1;36895:7;:11;36873:33;;37062:1;37028:17;:30;37046:11;37028:30;;;;;;;;;;;;:35;37024:384;;37166:13;;37151:11;:28;37147:242;;37346:19;37313:17;:30;37331:11;37313:30;;;;;;;;;;;:52;;;;37147:242;37024:384;36854:569;36797:626;37478:7;37474:1;37451:35;;37460:4;37451:35;;;;;;;;;;;;37497:50;37518:4;37532:1;37536:7;37545:1;37497:20;:50::i;:::-;37674:12;;:14;;;;;;;;;;;;;34713:2994;;;;34644:3063;;:::o;25814:1529::-;25879:20;25902:13;;25879:36;;25944:1;25930:16;;:2;:16;;;25926:48;;25955:19;;;;;;;;;;;;;;25926:48;26001:1;25989:8;:13;25985:44;;26011:18;;;;;;;;;;;;;;25985:44;26042:61;26072:1;26076:2;26080:12;26094:8;26042:21;:61::i;:::-;26585:1;9961:2;26556:1;:25;;26555:31;26543:8;:44;26517:18;:22;26536:2;26517:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;26864:139;26901:2;26955:33;26978:1;26982:2;26986:1;26955:14;:33::i;:::-;26922:30;26943:8;26922:20;:30::i;:::-;:66;26864:18;:139::i;:::-;26830:17;:31;26848:12;26830:31;;;;;;;;;;;:173;;;;27020:15;27038:12;27020:30;;27065:11;27094:8;27079:12;:23;27065:37;;27117:101;27169:9;;;;;;27165:2;27144:35;;27161:1;27144:35;;;;;;;;;;;;27213:3;27203:7;:13;27117:101;;27250:3;27234:13;:19;;;;26291:974;;27275:60;27304:1;27308:2;27312:12;27326:8;27275:20;:60::i;:::-;25868:1475;25814:1529;;:::o;21347:322::-;21417:14;21648:1;21638:8;21635:15;21610:23;21606:45;21596:55;;21347:322;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:329::-;5974:6;6023:2;6011:9;6002:7;5998:23;5994:32;5991:119;;;6029:79;;:::i;:::-;5991:119;6149:1;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6120:117;5915:329;;;;:::o;6250:117::-;6359:1;6356;6349:12;6373:180;6421:77;6418:1;6411:88;6518:4;6515:1;6508:15;6542:4;6539:1;6532:15;6559:281;6642:27;6664:4;6642:27;:::i;:::-;6634:6;6630:40;6772:6;6760:10;6757:22;6736:18;6724:10;6721:34;6718:62;6715:88;;;6783:18;;:::i;:::-;6715:88;6823:10;6819:2;6812:22;6602:238;6559:281;;:::o;6846:129::-;6880:6;6907:20;;:::i;:::-;6897:30;;6936:33;6964:4;6956:6;6936:33;:::i;:::-;6846:129;;;:::o;6981:311::-;7058:4;7148:18;7140:6;7137:30;7134:56;;;7170:18;;:::i;:::-;7134:56;7220:4;7212:6;7208:17;7200:25;;7280:4;7274;7270:15;7262:23;;6981:311;;;:::o;7298:117::-;7407:1;7404;7397:12;7438:710;7534:5;7559:81;7575:64;7632:6;7575:64;:::i;:::-;7559:81;:::i;:::-;7550:90;;7660:5;7689:6;7682:5;7675:21;7723:4;7716:5;7712:16;7705:23;;7776:4;7768:6;7764:17;7756:6;7752:30;7805:3;7797:6;7794:15;7791:122;;;7824:79;;:::i;:::-;7791:122;7939:6;7922:220;7956:6;7951:3;7948:15;7922:220;;;8031:3;8060:37;8093:3;8081:10;8060:37;:::i;:::-;8055:3;8048:50;8127:4;8122:3;8118:14;8111:21;;7998:144;7982:4;7977:3;7973:14;7966:21;;7922:220;;;7926:21;7540:608;;7438:710;;;;;:::o;8171:370::-;8242:5;8291:3;8284:4;8276:6;8272:17;8268:27;8258:122;;8299:79;;:::i;:::-;8258:122;8416:6;8403:20;8441:94;8531:3;8523:6;8516:4;8508:6;8504:17;8441:94;:::i;:::-;8432:103;;8248:293;8171:370;;;;:::o;8547:539::-;8631:6;8680:2;8668:9;8659:7;8655:23;8651:32;8648:119;;;8686:79;;:::i;:::-;8648:119;8834:1;8823:9;8819:17;8806:31;8864:18;8856:6;8853:30;8850:117;;;8886:79;;:::i;:::-;8850:117;8991:78;9061:7;9052:6;9041:9;9037:22;8991:78;:::i;:::-;8981:88;;8777:302;8547:539;;;;:::o;9092:144::-;9189:6;9223:5;9217:12;9207:22;;9092:144;;;:::o;9242:214::-;9371:11;9405:6;9400:3;9393:19;9445:4;9440:3;9436:14;9421:29;;9242:214;;;;:::o;9462:162::-;9559:4;9582:3;9574:11;;9612:4;9607:3;9603:14;9595:22;;9462:162;;;:::o;9630:108::-;9707:24;9725:5;9707:24;:::i;:::-;9702:3;9695:37;9630:108;;:::o;9744:101::-;9780:7;9820:18;9813:5;9809:30;9798:41;;9744:101;;;:::o;9851:105::-;9926:23;9943:5;9926:23;:::i;:::-;9921:3;9914:36;9851:105;;:::o;9962:99::-;10033:21;10048:5;10033:21;:::i;:::-;10028:3;10021:34;9962:99;;:::o;10067:91::-;10103:7;10143:8;10136:5;10132:20;10121:31;;10067:91;;;:::o;10164:105::-;10239:23;10256:5;10239:23;:::i;:::-;10234:3;10227:36;10164:105;;:::o;10347:862::-;10494:4;10489:3;10485:14;10581:4;10574:5;10570:16;10564:23;10600:63;10657:4;10652:3;10648:14;10634:12;10600:63;:::i;:::-;10509:164;10765:4;10758:5;10754:16;10748:23;10784:61;10839:4;10834:3;10830:14;10816:12;10784:61;:::i;:::-;10683:172;10939:4;10932:5;10928:16;10922:23;10958:57;11009:4;11004:3;11000:14;10986:12;10958:57;:::i;:::-;10865:160;11112:4;11105:5;11101:16;11095:23;11131:61;11186:4;11181:3;11177:14;11163:12;11131:61;:::i;:::-;11035:167;10463:746;10347:862;;:::o;11215:299::-;11344:10;11365:106;11467:3;11459:6;11365:106;:::i;:::-;11503:4;11498:3;11494:14;11480:28;;11215:299;;;;:::o;11520:143::-;11620:4;11652;11647:3;11643:14;11635:22;;11520:143;;;:::o;11745:972::-;11924:3;11953:84;12031:5;11953:84;:::i;:::-;12053:116;12162:6;12157:3;12053:116;:::i;:::-;12046:123;;12193:86;12273:5;12193:86;:::i;:::-;12302:7;12333:1;12318:374;12343:6;12340:1;12337:13;12318:374;;;12419:6;12413:13;12446:123;12565:3;12550:13;12446:123;:::i;:::-;12439:130;;12592:90;12675:6;12592:90;:::i;:::-;12582:100;;12378:314;12365:1;12362;12358:9;12353:14;;12318:374;;;12322:14;12708:3;12701:10;;11929:788;;;11745:972;;;;:::o;12723:493::-;12926:4;12964:2;12953:9;12949:18;12941:26;;13013:9;13007:4;13003:20;12999:1;12988:9;12984:17;12977:47;13041:168;13204:4;13195:6;13041:168;:::i;:::-;13033:176;;12723:493;;;;:::o;13222:114::-;13289:6;13323:5;13317:12;13307:22;;13222:114;;;:::o;13342:184::-;13441:11;13475:6;13470:3;13463:19;13515:4;13510:3;13506:14;13491:29;;13342:184;;;;:::o;13532:132::-;13599:4;13622:3;13614:11;;13652:4;13647:3;13643:14;13635:22;;13532:132;;;:::o;13670:108::-;13747:24;13765:5;13747:24;:::i;:::-;13742:3;13735:37;13670:108;;:::o;13784:179::-;13853:10;13874:46;13916:3;13908:6;13874:46;:::i;:::-;13952:4;13947:3;13943:14;13929:28;;13784:179;;;;:::o;13969:113::-;14039:4;14071;14066:3;14062:14;14054:22;;13969:113;;;:::o;14118:732::-;14237:3;14266:54;14314:5;14266:54;:::i;:::-;14336:86;14415:6;14410:3;14336:86;:::i;:::-;14329:93;;14446:56;14496:5;14446:56;:::i;:::-;14525:7;14556:1;14541:284;14566:6;14563:1;14560:13;14541:284;;;14642:6;14636:13;14669:63;14728:3;14713:13;14669:63;:::i;:::-;14662:70;;14755:60;14808:6;14755:60;:::i;:::-;14745:70;;14601:224;14588:1;14585;14581:9;14576:14;;14541:284;;;14545:14;14841:3;14834:10;;14242:608;;;14118:732;;;;:::o;14856:373::-;14999:4;15037:2;15026:9;15022:18;15014:26;;15086:9;15080:4;15076:20;15072:1;15061:9;15057:17;15050:47;15114:108;15217:4;15208:6;15114:108;:::i;:::-;15106:116;;14856:373;;;;:::o;15235:619::-;15312:6;15320;15328;15377:2;15365:9;15356:7;15352:23;15348:32;15345:119;;;15383:79;;:::i;:::-;15345:119;15503:1;15528:53;15573:7;15564:6;15553:9;15549:22;15528:53;:::i;:::-;15518:63;;15474:117;15630:2;15656:53;15701:7;15692:6;15681:9;15677:22;15656:53;:::i;:::-;15646:63;;15601:118;15758:2;15784:53;15829:7;15820:6;15809:9;15805:22;15784:53;:::i;:::-;15774:63;;15729:118;15235:619;;;;;:::o;15860:116::-;15930:21;15945:5;15930:21;:::i;:::-;15923:5;15920:32;15910:60;;15966:1;15963;15956:12;15910:60;15860:116;:::o;15982:133::-;16025:5;16063:6;16050:20;16041:29;;16079:30;16103:5;16079:30;:::i;:::-;15982:133;;;;:::o;16121:468::-;16186:6;16194;16243:2;16231:9;16222:7;16218:23;16214:32;16211:119;;;16249:79;;:::i;:::-;16211:119;16369:1;16394:53;16439:7;16430:6;16419:9;16415:22;16394:53;:::i;:::-;16384:63;;16340:117;16496:2;16522:50;16564:7;16555:6;16544:9;16540:22;16522:50;:::i;:::-;16512:60;;16467:115;16121:468;;;;;:::o;16595:117::-;16704:1;16701;16694:12;16718:307;16779:4;16869:18;16861:6;16858:30;16855:56;;;16891:18;;:::i;:::-;16855:56;16929:29;16951:6;16929:29;:::i;:::-;16921:37;;17013:4;17007;17003:15;16995:23;;16718:307;;;:::o;17031:154::-;17115:6;17110:3;17105;17092:30;17177:1;17168:6;17163:3;17159:16;17152:27;17031:154;;;:::o;17191:410::-;17268:5;17293:65;17309:48;17350:6;17309:48;:::i;:::-;17293:65;:::i;:::-;17284:74;;17381:6;17374:5;17367:21;17419:4;17412:5;17408:16;17457:3;17448:6;17443:3;17439:16;17436:25;17433:112;;;17464:79;;:::i;:::-;17433:112;17554:41;17588:6;17583:3;17578;17554:41;:::i;:::-;17274:327;17191:410;;;;;:::o;17620:338::-;17675:5;17724:3;17717:4;17709:6;17705:17;17701:27;17691:122;;17732:79;;:::i;:::-;17691:122;17849:6;17836:20;17874:78;17948:3;17940:6;17933:4;17925:6;17921:17;17874:78;:::i;:::-;17865:87;;17681:277;17620:338;;;;:::o;17964:943::-;18059:6;18067;18075;18083;18132:3;18120:9;18111:7;18107:23;18103:33;18100:120;;;18139:79;;:::i;:::-;18100:120;18259:1;18284:53;18329:7;18320:6;18309:9;18305:22;18284:53;:::i;:::-;18274:63;;18230:117;18386:2;18412:53;18457:7;18448:6;18437:9;18433:22;18412:53;:::i;:::-;18402:63;;18357:118;18514:2;18540:53;18585:7;18576:6;18565:9;18561:22;18540:53;:::i;:::-;18530:63;;18485:118;18670:2;18659:9;18655:18;18642:32;18701:18;18693:6;18690:30;18687:117;;;18723:79;;:::i;:::-;18687:117;18828:62;18882:7;18873:6;18862:9;18858:22;18828:62;:::i;:::-;18818:72;;18613:287;17964:943;;;;;;;:::o;18985:872::-;19142:4;19137:3;19133:14;19229:4;19222:5;19218:16;19212:23;19248:63;19305:4;19300:3;19296:14;19282:12;19248:63;:::i;:::-;19157:164;19413:4;19406:5;19402:16;19396:23;19432:61;19487:4;19482:3;19478:14;19464:12;19432:61;:::i;:::-;19331:172;19587:4;19580:5;19576:16;19570:23;19606:57;19657:4;19652:3;19648:14;19634:12;19606:57;:::i;:::-;19513:160;19760:4;19753:5;19749:16;19743:23;19779:61;19834:4;19829:3;19825:14;19811:12;19779:61;:::i;:::-;19683:167;19111:746;18985:872;;:::o;19863:343::-;20016:4;20054:3;20043:9;20039:19;20031:27;;20068:131;20196:1;20185:9;20181:17;20172:6;20068:131;:::i;:::-;19863:343;;;;:::o;20212:474::-;20280:6;20288;20337:2;20325:9;20316:7;20312:23;20308:32;20305:119;;;20343:79;;:::i;:::-;20305:119;20463:1;20488:53;20533:7;20524:6;20513:9;20509:22;20488:53;:::i;:::-;20478:63;;20434:117;20590:2;20616:53;20661:7;20652:6;20641:9;20637:22;20616:53;:::i;:::-;20606:63;;20561:118;20212:474;;;;;:::o;20692:180::-;20740:77;20737:1;20730:88;20837:4;20834:1;20827:15;20861:4;20858:1;20851:15;20878:320;20922:6;20959:1;20953:4;20949:12;20939:22;;21006:1;21000:4;20996:12;21027:18;21017:81;;21083:4;21075:6;21071:17;21061:27;;21017:81;21145:2;21137:6;21134:14;21114:18;21111:38;21108:84;;21164:18;;:::i;:::-;21108:84;20929:269;20878:320;;;:::o;21204:177::-;21344:29;21340:1;21332:6;21328:14;21321:53;21204:177;:::o;21387:366::-;21529:3;21550:67;21614:2;21609:3;21550:67;:::i;:::-;21543:74;;21626:93;21715:3;21626:93;:::i;:::-;21744:2;21739:3;21735:12;21728:19;;21387:366;;;:::o;21759:419::-;21925:4;21963:2;21952:9;21948:18;21940:26;;22012:9;22006:4;22002:20;21998:1;21987:9;21983:17;21976:47;22040:131;22166:4;22040:131;:::i;:::-;22032:139;;21759:419;;;:::o;22184:236::-;22324:34;22320:1;22312:6;22308:14;22301:58;22393:19;22388:2;22380:6;22376:15;22369:44;22184:236;:::o;22426:366::-;22568:3;22589:67;22653:2;22648:3;22589:67;:::i;:::-;22582:74;;22665:93;22754:3;22665:93;:::i;:::-;22783:2;22778:3;22774:12;22767:19;;22426:366;;;:::o;22798:419::-;22964:4;23002:2;22991:9;22987:18;22979:26;;23051:9;23045:4;23041:20;23037:1;23026:9;23022:17;23015:47;23079:131;23205:4;23079:131;:::i;:::-;23071:139;;22798:419;;;:::o;23223:180::-;23271:77;23268:1;23261:88;23368:4;23365:1;23358:15;23392:4;23389:1;23382:15;23409:225;23549:34;23545:1;23537:6;23533:14;23526:58;23618:8;23613:2;23605:6;23601:15;23594:33;23409:225;:::o;23640:366::-;23782:3;23803:67;23867:2;23862:3;23803:67;:::i;:::-;23796:74;;23879:93;23968:3;23879:93;:::i;:::-;23997:2;23992:3;23988:12;23981:19;;23640:366;;;:::o;24012:419::-;24178:4;24216:2;24205:9;24201:18;24193:26;;24265:9;24259:4;24255:20;24251:1;24240:9;24236:17;24229:47;24293:131;24419:4;24293:131;:::i;:::-;24285:139;;24012:419;;;:::o;24437:143::-;24494:5;24525:6;24519:13;24510:22;;24541:33;24568:5;24541:33;:::i;:::-;24437:143;;;;:::o;24586:351::-;24656:6;24705:2;24693:9;24684:7;24680:23;24676:32;24673:119;;;24711:79;;:::i;:::-;24673:119;24831:1;24856:64;24912:7;24903:6;24892:9;24888:22;24856:64;:::i;:::-;24846:74;;24802:128;24586:351;;;;:::o;24943:231::-;25083:34;25079:1;25071:6;25067:14;25060:58;25152:14;25147:2;25139:6;25135:15;25128:39;24943:231;:::o;25180:366::-;25322:3;25343:67;25407:2;25402:3;25343:67;:::i;:::-;25336:74;;25419:93;25508:3;25419:93;:::i;:::-;25537:2;25532:3;25528:12;25521:19;;25180:366;;;:::o;25552:419::-;25718:4;25756:2;25745:9;25741:18;25733:26;;25805:9;25799:4;25795:20;25791:1;25780:9;25776:17;25769:47;25833:131;25959:4;25833:131;:::i;:::-;25825:139;;25552:419;;;:::o;25994:732::-;26101:5;26126:81;26142:64;26199:6;26142:64;:::i;:::-;26126:81;:::i;:::-;26117:90;;26227:5;26256:6;26249:5;26242:21;26290:4;26283:5;26279:16;26272:23;;26343:4;26335:6;26331:17;26323:6;26319:30;26372:3;26364:6;26361:15;26358:122;;;26391:79;;:::i;:::-;26358:122;26506:6;26489:231;26523:6;26518:3;26515:15;26489:231;;;26598:3;26627:48;26671:3;26659:10;26627:48;:::i;:::-;26622:3;26615:61;26705:4;26700:3;26696:14;26689:21;;26565:155;26549:4;26544:3;26540:14;26533:21;;26489:231;;;26493:21;26107:619;;25994:732;;;;;:::o;26749:385::-;26831:5;26880:3;26873:4;26865:6;26861:17;26857:27;26847:122;;26888:79;;:::i;:::-;26847:122;26998:6;26992:13;27023:105;27124:3;27116:6;27109:4;27101:6;27097:17;27023:105;:::i;:::-;27014:114;;26837:297;26749:385;;;;:::o;27140:554::-;27235:6;27284:2;27272:9;27263:7;27259:23;27255:32;27252:119;;;27290:79;;:::i;:::-;27252:119;27431:1;27420:9;27416:17;27410:24;27461:18;27453:6;27450:30;27447:117;;;27483:79;;:::i;:::-;27447:117;27588:89;27669:7;27660:6;27649:9;27645:22;27588:89;:::i;:::-;27578:99;;27381:306;27140:554;;;;:::o;27700:180::-;27748:77;27745:1;27738:88;27845:4;27842:1;27835:15;27869:4;27866:1;27859:15;27886:233;27925:3;27948:24;27966:5;27948:24;:::i;:::-;27939:33;;27994:66;27987:5;27984:77;27981:103;;28064:18;;:::i;:::-;27981:103;28111:1;28104:5;28100:13;28093:20;;27886:233;;;:::o;28125:148::-;28227:11;28264:3;28249:18;;28125:148;;;;:::o;28279:377::-;28385:3;28413:39;28446:5;28413:39;:::i;:::-;28468:89;28550:6;28545:3;28468:89;:::i;:::-;28461:96;;28566:52;28611:6;28606:3;28599:4;28592:5;28588:16;28566:52;:::i;:::-;28643:6;28638:3;28634:16;28627:23;;28389:267;28279:377;;;;:::o;28662:435::-;28842:3;28864:95;28955:3;28946:6;28864:95;:::i;:::-;28857:102;;28976:95;29067:3;29058:6;28976:95;:::i;:::-;28969:102;;29088:3;29081:10;;28662:435;;;;;:::o;29103:222::-;29243:34;29239:1;29231:6;29227:14;29220:58;29312:5;29307:2;29299:6;29295:15;29288:30;29103:222;:::o;29331:366::-;29473:3;29494:67;29558:2;29553:3;29494:67;:::i;:::-;29487:74;;29570:93;29659:3;29570:93;:::i;:::-;29688:2;29683:3;29679:12;29672:19;;29331:366;;;:::o;29703:419::-;29869:4;29907:2;29896:9;29892:18;29884:26;;29956:9;29950:4;29946:20;29942:1;29931:9;29927:17;29920:47;29984:131;30110:4;29984:131;:::i;:::-;29976:139;;29703:419;;;:::o;30128:98::-;30179:6;30213:5;30207:12;30197:22;;30128:98;;;:::o;30232:168::-;30315:11;30349:6;30344:3;30337:19;30389:4;30384:3;30380:14;30365:29;;30232:168;;;;:::o;30406:360::-;30492:3;30520:38;30552:5;30520:38;:::i;:::-;30574:70;30637:6;30632:3;30574:70;:::i;:::-;30567:77;;30653:52;30698:6;30693:3;30686:4;30679:5;30675:16;30653:52;:::i;:::-;30730:29;30752:6;30730:29;:::i;:::-;30725:3;30721:39;30714:46;;30496:270;30406:360;;;;:::o;30772:640::-;30967:4;31005:3;30994:9;30990:19;30982:27;;31019:71;31087:1;31076:9;31072:17;31063:6;31019:71;:::i;:::-;31100:72;31168:2;31157:9;31153:18;31144:6;31100:72;:::i;:::-;31182;31250:2;31239:9;31235:18;31226:6;31182:72;:::i;:::-;31301:9;31295:4;31291:20;31286:2;31275:9;31271:18;31264:48;31329:76;31400:4;31391:6;31329:76;:::i;:::-;31321:84;;30772:640;;;;;;;:::o;31418:141::-;31474:5;31505:6;31499:13;31490:22;;31521:32;31547:5;31521:32;:::i;:::-;31418:141;;;;:::o;31565:349::-;31634:6;31683:2;31671:9;31662:7;31658:23;31654:32;31651:119;;;31689:79;;:::i;:::-;31651:119;31809:1;31834:63;31889:7;31880:6;31869:9;31865:22;31834:63;:::i;:::-;31824:73;;31780:127;31565:349;;;;:::o
Swarm Source
ipfs://9e74c0e8a6c6ec1ec1c9833bbc0e606da40ca17a4446f44f44c73de52d26594f