ERC-721
Overview
Max Total Supply
100 BW
Holders
97
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 BWLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
TheBlueWind
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-10-19 */ // File: @openzeppelin/[email protected]/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/[email protected]/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: TheBlueWind/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: TheBlueWind/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 virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see `_totalMinted`. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to `_startTokenId()` unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } /** * @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 virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view virtual 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 virtual 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 virtual returns (uint64) { return uint64(_packedAddressData[owner] >> BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX); _packedAddressData[owner] = packed; } /** * 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 virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * 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 virtual 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 virtual 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 virtual 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 virtual 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 virtual 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 virtual { _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 virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (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 virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev 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 virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev 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 virtual 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: TheBlueWind/ZS2.sol pragma solidity ^0.8.17; contract TheBlueWind is ERC721A, Ownable { constructor() ERC721A("TheBlueWind", "BW") { } uint256 public immutable MAX_SUPPLY = 100; uint256 public totalMinted = 0; // Add Addresses and Mint NFTs function addAndMint(address[] memory addresses) external onlyOwner{ uint256 arraySize = addresses.length; require(totalMinted + arraySize <= MAX_SUPPLY,"Not enough tokens left!"); for (uint256 i = 0; i < arraySize; i++) { _safeMint(addresses[i],1); } totalMinted+=arraySize; } // metadata URI bool public revealed = false; string private _baseTokenURI; string private notRevealedUri; function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner { notRevealedUri = _notRevealedURI; } function revealItems() external onlyOwner{ revealed = true; } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function setBaseURI(string calldata baseURI) external onlyOwner { _baseTokenURI = baseURI; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId),"ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); if(revealed == false) { return notRevealedUri; } return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } // Withdraw function withdraw() external onlyOwner{ payable(owner()).transfer(address(this).balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addAndMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealItems","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a0604052606460809081525060006009556000600a60006101000a81548160ff0219169083151502179055503480156200003957600080fd5b506040518060400160405280600b81526020017f546865426c756557696e640000000000000000000000000000000000000000008152506040518060400160405280600281526020017f42570000000000000000000000000000000000000000000000000000000000008152508160029081620000b7919062000455565b508060039081620000c9919062000455565b50620000da6200010860201b60201c565b600081905550505062000102620000f66200010d60201b60201c565b6200011560201b60201c565b6200053c565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200025d57607f821691505b60208210810362000273576200027262000215565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620002dd7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200029e565b620002e986836200029e565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000336620003306200032a8462000301565b6200030b565b62000301565b9050919050565b6000819050919050565b620003528362000315565b6200036a62000361826200033d565b848454620002ab565b825550505050565b600090565b6200038162000372565b6200038e81848462000347565b505050565b5b81811015620003b657620003aa60008262000377565b60018101905062000394565b5050565b601f8211156200040557620003cf8162000279565b620003da846200028e565b81016020851015620003ea578190505b62000402620003f9856200028e565b83018262000393565b50505b505050565b600082821c905092915050565b60006200042a600019846008026200040a565b1980831691505092915050565b600062000445838362000417565b9150826002028217905092915050565b6200046082620001db565b67ffffffffffffffff8111156200047c576200047b620001e6565b5b62000488825462000244565b62000495828285620003ba565b600060209050601f831160018114620004cd5760008415620004b8578287015190505b620004c4858262000437565b86555062000534565b601f198416620004dd8662000279565b60005b828110156200050757848901518255600182019150602085019450602081019050620004e0565b8683101562000527578489015162000523601f89168262000417565b8355505b6001600288020188555050505b505050505050565b608051612dbf6200055f60003960008181610aa00152610e290152612dbf6000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c806370a08231116100de578063a2309ff811610097578063c87b56dd11610071578063c87b56dd146103ec578063e985e9c51461041c578063f2c4ce1e1461044c578063f2fde38b1461046857610173565b8063a2309ff8146103a8578063a3cae03d146103c6578063b88d4fde146103d057610173565b806370a08231146102fa578063715018a61461032a5780638b6280d8146103345780638da5cb5b1461035057806395d89b411461036e578063a22cb4651461038c57610173565b806332cb6b0c1161013057806332cb6b0c1461024c5780633ccfd60b1461026a57806342842e0e14610274578063518302271461029057806355f804b3146102ae5780636352211e146102ca57610173565b806301ffc9a71461017857806306fdde03146101a8578063081812fc146101c6578063095ea7b3146101f657806318160ddd1461021257806323b872dd14610230575b600080fd5b610192600480360381019061018d9190611dc6565b610484565b60405161019f9190611e0e565b60405180910390f35b6101b0610516565b6040516101bd9190611eb9565b60405180910390f35b6101e060048036038101906101db9190611f11565b6105a8565b6040516101ed9190611f7f565b60405180910390f35b610210600480360381019061020b9190611fc6565b610624565b005b61021a610765565b6040516102279190612015565b60405180910390f35b61024a60048036038101906102459190612030565b61077c565b005b610254610a9e565b6040516102619190612015565b60405180910390f35b610272610ac2565b005b61028e60048036038101906102899190612030565b610b8e565b005b610298610bae565b6040516102a59190611e0e565b60405180910390f35b6102c860048036038101906102c391906120e8565b610bc1565b005b6102e460048036038101906102df9190611f11565b610c53565b6040516102f19190611f7f565b60405180910390f35b610314600480360381019061030f9190612135565b610c65565b6040516103219190612015565b60405180910390f35b610332610d1d565b005b61034e600480360381019061034991906122a0565b610da5565b005b610358610ef8565b6040516103659190611f7f565b60405180910390f35b610376610f22565b6040516103839190611eb9565b60405180910390f35b6103a660048036038101906103a19190612315565b610fb4565b005b6103b061112b565b6040516103bd9190612015565b60405180910390f35b6103ce611131565b005b6103ea60048036038101906103e5919061240a565b6111ca565b005b61040660048036038101906104019190611f11565b61123d565b6040516104139190611eb9565b60405180910390f35b6104366004803603810190610431919061248d565b611393565b6040516104439190611e0e565b60405180910390f35b6104666004803603810190610461919061256e565b611427565b005b610482600480360381019061047d9190612135565b6114b6565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104df57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061050f5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610525906125e6565b80601f0160208091040260200160405190810160405280929190818152602001828054610551906125e6565b801561059e5780601f106105735761010080835404028352916020019161059e565b820191906000526020600020905b81548152906001019060200180831161058157829003601f168201915b5050505050905090565b60006105b3826115ad565b6105e9576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061062f82610c53565b90508073ffffffffffffffffffffffffffffffffffffffff1661065061160c565b73ffffffffffffffffffffffffffffffffffffffff16146106b35761067c8161067761160c565b611393565b6106b2576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061076f611614565b6001546000540303905090565b600061078782611619565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146107ee576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806107fa846116e5565b91509150610810818761080b61160c565b611707565b61085c576108258661082061160c565b611393565b61085b576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036108c2576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108cf868686600161174b565b80156108da57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506109a885610984888887611751565b7c020000000000000000000000000000000000000000000000000000000017611779565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610a2e5760006001850190506000600460008381526020019081526020016000205403610a2c576000548114610a2b578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610a9686868660016117a4565b505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b610aca6117aa565b73ffffffffffffffffffffffffffffffffffffffff16610ae8610ef8565b73ffffffffffffffffffffffffffffffffffffffff1614610b3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3590612663565b60405180910390fd5b610b46610ef8565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610b8b573d6000803e3d6000fd5b50565b610ba9838383604051806020016040528060008152506111ca565b505050565b600a60009054906101000a900460ff1681565b610bc96117aa565b73ffffffffffffffffffffffffffffffffffffffff16610be7610ef8565b73ffffffffffffffffffffffffffffffffffffffff1614610c3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3490612663565b60405180910390fd5b8181600b9182610c4e92919061283a565b505050565b6000610c5e82611619565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ccc576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610d256117aa565b73ffffffffffffffffffffffffffffffffffffffff16610d43610ef8565b73ffffffffffffffffffffffffffffffffffffffff1614610d99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9090612663565b60405180910390fd5b610da360006117b2565b565b610dad6117aa565b73ffffffffffffffffffffffffffffffffffffffff16610dcb610ef8565b73ffffffffffffffffffffffffffffffffffffffff1614610e21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1890612663565b60405180910390fd5b6000815190507f000000000000000000000000000000000000000000000000000000000000000081600954610e569190612939565b1115610e97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8e906129b9565b60405180910390fd5b60005b81811015610eda57610ec7838281518110610eb857610eb76129d9565b5b60200260200101516001611878565b8080610ed290612a08565b915050610e9a565b508060096000828254610eed9190612939565b925050819055505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610f31906125e6565b80601f0160208091040260200160405190810160405280929190818152602001828054610f5d906125e6565b8015610faa5780601f10610f7f57610100808354040283529160200191610faa565b820191906000526020600020905b815481529060010190602001808311610f8d57829003601f168201915b5050505050905090565b610fbc61160c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611020576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061102d61160c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166110da61160c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161111f9190611e0e565b60405180910390a35050565b60095481565b6111396117aa565b73ffffffffffffffffffffffffffffffffffffffff16611157610ef8565b73ffffffffffffffffffffffffffffffffffffffff16146111ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a490612663565b60405180910390fd5b6001600a60006101000a81548160ff021916908315150217905550565b6111d584848461077c565b60008373ffffffffffffffffffffffffffffffffffffffff163b146112375761120084848484611896565b611236576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060611248826115ad565b611287576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127e90612ac2565b60405180910390fd5b60006112916119e6565b905060001515600a60009054906101000a900460ff1615150361134157600c80546112bb906125e6565b80601f01602080910402602001604051908101604052809291908181526020018280546112e7906125e6565b80156113345780601f1061130957610100808354040283529160200191611334565b820191906000526020600020905b81548152906001019060200180831161131757829003601f168201915b505050505091505061138e565b600081510361135f576040518060200160405280600081525061138a565b8061136984611a78565b60405160200161137a929190612b1e565b6040516020818303038152906040525b9150505b919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61142f6117aa565b73ffffffffffffffffffffffffffffffffffffffff1661144d610ef8565b73ffffffffffffffffffffffffffffffffffffffff16146114a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149a90612663565b60405180910390fd5b80600c90816114b29190612b42565b5050565b6114be6117aa565b73ffffffffffffffffffffffffffffffffffffffff166114dc610ef8565b73ffffffffffffffffffffffffffffffffffffffff1614611532576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152990612663565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036115a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159890612c86565b60405180910390fd5b6115aa816117b2565b50565b6000816115b8611614565b111580156115c7575060005482105b8015611605575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b60008082905080611628611614565b116116ae576000548110156116ad5760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036116ab575b600081036116a1576004600083600190039350838152602001908152602001600020549050611677565b80925050506116e0565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611768868684611ad2565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611892828260405180602001604052806000815250611adb565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026118bc61160c565b8786866040518563ffffffff1660e01b81526004016118de9493929190612cfb565b6020604051808303816000875af192505050801561191a57506040513d601f19601f820116820180604052508101906119179190612d5c565b60015b611993573d806000811461194a576040519150601f19603f3d011682016040523d82523d6000602084013e61194f565b606091505b50600081510361198b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600b80546119f5906125e6565b80601f0160208091040260200160405190810160405280929190818152602001828054611a21906125e6565b8015611a6e5780601f10611a4357610100808354040283529160200191611a6e565b820191906000526020600020905b815481529060010190602001808311611a5157829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b8015611abe57600183039250600a81066030018353600a81049050611a9e565b508181036020830392508083525050919050565b60009392505050565b611ae58383611b78565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611b7357600080549050600083820390505b611b256000868380600101945086611896565b611b5b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611b12578160005414611b7057600080fd5b50505b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611be4576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008203611c1e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c2b600084838561174b565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611ca283611c936000866000611751565b611c9c85611d4a565b17611779565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210611cc657806000819055505050611d4560008483856117a4565b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611da381611d6e565b8114611dae57600080fd5b50565b600081359050611dc081611d9a565b92915050565b600060208284031215611ddc57611ddb611d64565b5b6000611dea84828501611db1565b91505092915050565b60008115159050919050565b611e0881611df3565b82525050565b6000602082019050611e236000830184611dff565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611e63578082015181840152602081019050611e48565b60008484015250505050565b6000601f19601f8301169050919050565b6000611e8b82611e29565b611e958185611e34565b9350611ea5818560208601611e45565b611eae81611e6f565b840191505092915050565b60006020820190508181036000830152611ed38184611e80565b905092915050565b6000819050919050565b611eee81611edb565b8114611ef957600080fd5b50565b600081359050611f0b81611ee5565b92915050565b600060208284031215611f2757611f26611d64565b5b6000611f3584828501611efc565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611f6982611f3e565b9050919050565b611f7981611f5e565b82525050565b6000602082019050611f946000830184611f70565b92915050565b611fa381611f5e565b8114611fae57600080fd5b50565b600081359050611fc081611f9a565b92915050565b60008060408385031215611fdd57611fdc611d64565b5b6000611feb85828601611fb1565b9250506020611ffc85828601611efc565b9150509250929050565b61200f81611edb565b82525050565b600060208201905061202a6000830184612006565b92915050565b60008060006060848603121561204957612048611d64565b5b600061205786828701611fb1565b935050602061206886828701611fb1565b925050604061207986828701611efc565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f8401126120a8576120a7612083565b5b8235905067ffffffffffffffff8111156120c5576120c4612088565b5b6020830191508360018202830111156120e1576120e061208d565b5b9250929050565b600080602083850312156120ff576120fe611d64565b5b600083013567ffffffffffffffff81111561211d5761211c611d69565b5b61212985828601612092565b92509250509250929050565b60006020828403121561214b5761214a611d64565b5b600061215984828501611fb1565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61219a82611e6f565b810181811067ffffffffffffffff821117156121b9576121b8612162565b5b80604052505050565b60006121cc611d5a565b90506121d88282612191565b919050565b600067ffffffffffffffff8211156121f8576121f7612162565b5b602082029050602081019050919050565b600061221c612217846121dd565b6121c2565b9050808382526020820190506020840283018581111561223f5761223e61208d565b5b835b8181101561226857806122548882611fb1565b845260208401935050602081019050612241565b5050509392505050565b600082601f83011261228757612286612083565b5b8135612297848260208601612209565b91505092915050565b6000602082840312156122b6576122b5611d64565b5b600082013567ffffffffffffffff8111156122d4576122d3611d69565b5b6122e084828501612272565b91505092915050565b6122f281611df3565b81146122fd57600080fd5b50565b60008135905061230f816122e9565b92915050565b6000806040838503121561232c5761232b611d64565b5b600061233a85828601611fb1565b925050602061234b85828601612300565b9150509250929050565b600080fd5b600067ffffffffffffffff82111561237557612374612162565b5b61237e82611e6f565b9050602081019050919050565b82818337600083830152505050565b60006123ad6123a88461235a565b6121c2565b9050828152602081018484840111156123c9576123c8612355565b5b6123d484828561238b565b509392505050565b600082601f8301126123f1576123f0612083565b5b813561240184826020860161239a565b91505092915050565b6000806000806080858703121561242457612423611d64565b5b600061243287828801611fb1565b945050602061244387828801611fb1565b935050604061245487828801611efc565b925050606085013567ffffffffffffffff81111561247557612474611d69565b5b612481878288016123dc565b91505092959194509250565b600080604083850312156124a4576124a3611d64565b5b60006124b285828601611fb1565b92505060206124c385828601611fb1565b9150509250929050565b600067ffffffffffffffff8211156124e8576124e7612162565b5b6124f182611e6f565b9050602081019050919050565b600061251161250c846124cd565b6121c2565b90508281526020810184848401111561252d5761252c612355565b5b61253884828561238b565b509392505050565b600082601f83011261255557612554612083565b5b81356125658482602086016124fe565b91505092915050565b60006020828403121561258457612583611d64565b5b600082013567ffffffffffffffff8111156125a2576125a1611d69565b5b6125ae84828501612540565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806125fe57607f821691505b602082108103612611576126106125b7565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061264d602083611e34565b915061265882612617565b602082019050919050565b6000602082019050818103600083015261267c81612640565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026126f07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826126b3565b6126fa86836126b3565b95508019841693508086168417925050509392505050565b6000819050919050565b600061273761273261272d84611edb565b612712565b611edb565b9050919050565b6000819050919050565b6127518361271c565b61276561275d8261273e565b8484546126c0565b825550505050565b600090565b61277a61276d565b612785818484612748565b505050565b5b818110156127a95761279e600082612772565b60018101905061278b565b5050565b601f8211156127ee576127bf8161268e565b6127c8846126a3565b810160208510156127d7578190505b6127eb6127e3856126a3565b83018261278a565b50505b505050565b600082821c905092915050565b6000612811600019846008026127f3565b1980831691505092915050565b600061282a8383612800565b9150826002028217905092915050565b6128448383612683565b67ffffffffffffffff81111561285d5761285c612162565b5b61286782546125e6565b6128728282856127ad565b6000601f8311600181146128a1576000841561288f578287013590505b612899858261281e565b865550612901565b601f1984166128af8661268e565b60005b828110156128d7578489013582556001820191506020850194506020810190506128b2565b868310156128f457848901356128f0601f891682612800565b8355505b6001600288020188555050505b50505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061294482611edb565b915061294f83611edb565b92508282019050808211156129675761296661290a565b5b92915050565b7f4e6f7420656e6f75676820746f6b656e73206c65667421000000000000000000600082015250565b60006129a3601783611e34565b91506129ae8261296d565b602082019050919050565b600060208201905081810360008301526129d281612996565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000612a1382611edb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612a4557612a4461290a565b5b600182019050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000612aac602f83611e34565b9150612ab782612a50565b604082019050919050565b60006020820190508181036000830152612adb81612a9f565b9050919050565b600081905092915050565b6000612af882611e29565b612b028185612ae2565b9350612b12818560208601611e45565b80840191505092915050565b6000612b2a8285612aed565b9150612b368284612aed565b91508190509392505050565b612b4b82611e29565b67ffffffffffffffff811115612b6457612b63612162565b5b612b6e82546125e6565b612b798282856127ad565b600060209050601f831160018114612bac5760008415612b9a578287015190505b612ba4858261281e565b865550612c0c565b601f198416612bba8661268e565b60005b82811015612be257848901518255600182019150602085019450602081019050612bbd565b86831015612bff5784890151612bfb601f891682612800565b8355505b6001600288020188555050505b505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612c70602683611e34565b9150612c7b82612c14565b604082019050919050565b60006020820190508181036000830152612c9f81612c63565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000612ccd82612ca6565b612cd78185612cb1565b9350612ce7818560208601611e45565b612cf081611e6f565b840191505092915050565b6000608082019050612d106000830187611f70565b612d1d6020830186611f70565b612d2a6040830185612006565b8181036060830152612d3c8184612cc2565b905095945050505050565b600081519050612d5681611d9a565b92915050565b600060208284031215612d7257612d71611d64565b5b6000612d8084828501612d47565b9150509291505056fea26469706673582212202baad1b5c2aa70a96fbc370d7081cf42a4163f3a3209144d72a37d193321682c64736f6c63430008110033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101735760003560e01c806370a08231116100de578063a2309ff811610097578063c87b56dd11610071578063c87b56dd146103ec578063e985e9c51461041c578063f2c4ce1e1461044c578063f2fde38b1461046857610173565b8063a2309ff8146103a8578063a3cae03d146103c6578063b88d4fde146103d057610173565b806370a08231146102fa578063715018a61461032a5780638b6280d8146103345780638da5cb5b1461035057806395d89b411461036e578063a22cb4651461038c57610173565b806332cb6b0c1161013057806332cb6b0c1461024c5780633ccfd60b1461026a57806342842e0e14610274578063518302271461029057806355f804b3146102ae5780636352211e146102ca57610173565b806301ffc9a71461017857806306fdde03146101a8578063081812fc146101c6578063095ea7b3146101f657806318160ddd1461021257806323b872dd14610230575b600080fd5b610192600480360381019061018d9190611dc6565b610484565b60405161019f9190611e0e565b60405180910390f35b6101b0610516565b6040516101bd9190611eb9565b60405180910390f35b6101e060048036038101906101db9190611f11565b6105a8565b6040516101ed9190611f7f565b60405180910390f35b610210600480360381019061020b9190611fc6565b610624565b005b61021a610765565b6040516102279190612015565b60405180910390f35b61024a60048036038101906102459190612030565b61077c565b005b610254610a9e565b6040516102619190612015565b60405180910390f35b610272610ac2565b005b61028e60048036038101906102899190612030565b610b8e565b005b610298610bae565b6040516102a59190611e0e565b60405180910390f35b6102c860048036038101906102c391906120e8565b610bc1565b005b6102e460048036038101906102df9190611f11565b610c53565b6040516102f19190611f7f565b60405180910390f35b610314600480360381019061030f9190612135565b610c65565b6040516103219190612015565b60405180910390f35b610332610d1d565b005b61034e600480360381019061034991906122a0565b610da5565b005b610358610ef8565b6040516103659190611f7f565b60405180910390f35b610376610f22565b6040516103839190611eb9565b60405180910390f35b6103a660048036038101906103a19190612315565b610fb4565b005b6103b061112b565b6040516103bd9190612015565b60405180910390f35b6103ce611131565b005b6103ea60048036038101906103e5919061240a565b6111ca565b005b61040660048036038101906104019190611f11565b61123d565b6040516104139190611eb9565b60405180910390f35b6104366004803603810190610431919061248d565b611393565b6040516104439190611e0e565b60405180910390f35b6104666004803603810190610461919061256e565b611427565b005b610482600480360381019061047d9190612135565b6114b6565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104df57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061050f5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610525906125e6565b80601f0160208091040260200160405190810160405280929190818152602001828054610551906125e6565b801561059e5780601f106105735761010080835404028352916020019161059e565b820191906000526020600020905b81548152906001019060200180831161058157829003601f168201915b5050505050905090565b60006105b3826115ad565b6105e9576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061062f82610c53565b90508073ffffffffffffffffffffffffffffffffffffffff1661065061160c565b73ffffffffffffffffffffffffffffffffffffffff16146106b35761067c8161067761160c565b611393565b6106b2576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061076f611614565b6001546000540303905090565b600061078782611619565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146107ee576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806107fa846116e5565b91509150610810818761080b61160c565b611707565b61085c576108258661082061160c565b611393565b61085b576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036108c2576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108cf868686600161174b565b80156108da57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506109a885610984888887611751565b7c020000000000000000000000000000000000000000000000000000000017611779565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610a2e5760006001850190506000600460008381526020019081526020016000205403610a2c576000548114610a2b578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610a9686868660016117a4565b505050505050565b7f000000000000000000000000000000000000000000000000000000000000006481565b610aca6117aa565b73ffffffffffffffffffffffffffffffffffffffff16610ae8610ef8565b73ffffffffffffffffffffffffffffffffffffffff1614610b3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3590612663565b60405180910390fd5b610b46610ef8565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610b8b573d6000803e3d6000fd5b50565b610ba9838383604051806020016040528060008152506111ca565b505050565b600a60009054906101000a900460ff1681565b610bc96117aa565b73ffffffffffffffffffffffffffffffffffffffff16610be7610ef8565b73ffffffffffffffffffffffffffffffffffffffff1614610c3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3490612663565b60405180910390fd5b8181600b9182610c4e92919061283a565b505050565b6000610c5e82611619565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ccc576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610d256117aa565b73ffffffffffffffffffffffffffffffffffffffff16610d43610ef8565b73ffffffffffffffffffffffffffffffffffffffff1614610d99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9090612663565b60405180910390fd5b610da360006117b2565b565b610dad6117aa565b73ffffffffffffffffffffffffffffffffffffffff16610dcb610ef8565b73ffffffffffffffffffffffffffffffffffffffff1614610e21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1890612663565b60405180910390fd5b6000815190507f000000000000000000000000000000000000000000000000000000000000006481600954610e569190612939565b1115610e97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8e906129b9565b60405180910390fd5b60005b81811015610eda57610ec7838281518110610eb857610eb76129d9565b5b60200260200101516001611878565b8080610ed290612a08565b915050610e9a565b508060096000828254610eed9190612939565b925050819055505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610f31906125e6565b80601f0160208091040260200160405190810160405280929190818152602001828054610f5d906125e6565b8015610faa5780601f10610f7f57610100808354040283529160200191610faa565b820191906000526020600020905b815481529060010190602001808311610f8d57829003601f168201915b5050505050905090565b610fbc61160c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611020576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061102d61160c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166110da61160c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161111f9190611e0e565b60405180910390a35050565b60095481565b6111396117aa565b73ffffffffffffffffffffffffffffffffffffffff16611157610ef8565b73ffffffffffffffffffffffffffffffffffffffff16146111ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a490612663565b60405180910390fd5b6001600a60006101000a81548160ff021916908315150217905550565b6111d584848461077c565b60008373ffffffffffffffffffffffffffffffffffffffff163b146112375761120084848484611896565b611236576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060611248826115ad565b611287576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127e90612ac2565b60405180910390fd5b60006112916119e6565b905060001515600a60009054906101000a900460ff1615150361134157600c80546112bb906125e6565b80601f01602080910402602001604051908101604052809291908181526020018280546112e7906125e6565b80156113345780601f1061130957610100808354040283529160200191611334565b820191906000526020600020905b81548152906001019060200180831161131757829003601f168201915b505050505091505061138e565b600081510361135f576040518060200160405280600081525061138a565b8061136984611a78565b60405160200161137a929190612b1e565b6040516020818303038152906040525b9150505b919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61142f6117aa565b73ffffffffffffffffffffffffffffffffffffffff1661144d610ef8565b73ffffffffffffffffffffffffffffffffffffffff16146114a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149a90612663565b60405180910390fd5b80600c90816114b29190612b42565b5050565b6114be6117aa565b73ffffffffffffffffffffffffffffffffffffffff166114dc610ef8565b73ffffffffffffffffffffffffffffffffffffffff1614611532576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152990612663565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036115a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159890612c86565b60405180910390fd5b6115aa816117b2565b50565b6000816115b8611614565b111580156115c7575060005482105b8015611605575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b60008082905080611628611614565b116116ae576000548110156116ad5760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036116ab575b600081036116a1576004600083600190039350838152602001908152602001600020549050611677565b80925050506116e0565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611768868684611ad2565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611892828260405180602001604052806000815250611adb565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026118bc61160c565b8786866040518563ffffffff1660e01b81526004016118de9493929190612cfb565b6020604051808303816000875af192505050801561191a57506040513d601f19601f820116820180604052508101906119179190612d5c565b60015b611993573d806000811461194a576040519150601f19603f3d011682016040523d82523d6000602084013e61194f565b606091505b50600081510361198b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600b80546119f5906125e6565b80601f0160208091040260200160405190810160405280929190818152602001828054611a21906125e6565b8015611a6e5780601f10611a4357610100808354040283529160200191611a6e565b820191906000526020600020905b815481529060010190602001808311611a5157829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b8015611abe57600183039250600a81066030018353600a81049050611a9e565b508181036020830392508083525050919050565b60009392505050565b611ae58383611b78565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611b7357600080549050600083820390505b611b256000868380600101945086611896565b611b5b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611b12578160005414611b7057600080fd5b50505b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611be4576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008203611c1e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c2b600084838561174b565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611ca283611c936000866000611751565b611c9c85611d4a565b17611779565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210611cc657806000819055505050611d4560008483856117a4565b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611da381611d6e565b8114611dae57600080fd5b50565b600081359050611dc081611d9a565b92915050565b600060208284031215611ddc57611ddb611d64565b5b6000611dea84828501611db1565b91505092915050565b60008115159050919050565b611e0881611df3565b82525050565b6000602082019050611e236000830184611dff565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611e63578082015181840152602081019050611e48565b60008484015250505050565b6000601f19601f8301169050919050565b6000611e8b82611e29565b611e958185611e34565b9350611ea5818560208601611e45565b611eae81611e6f565b840191505092915050565b60006020820190508181036000830152611ed38184611e80565b905092915050565b6000819050919050565b611eee81611edb565b8114611ef957600080fd5b50565b600081359050611f0b81611ee5565b92915050565b600060208284031215611f2757611f26611d64565b5b6000611f3584828501611efc565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611f6982611f3e565b9050919050565b611f7981611f5e565b82525050565b6000602082019050611f946000830184611f70565b92915050565b611fa381611f5e565b8114611fae57600080fd5b50565b600081359050611fc081611f9a565b92915050565b60008060408385031215611fdd57611fdc611d64565b5b6000611feb85828601611fb1565b9250506020611ffc85828601611efc565b9150509250929050565b61200f81611edb565b82525050565b600060208201905061202a6000830184612006565b92915050565b60008060006060848603121561204957612048611d64565b5b600061205786828701611fb1565b935050602061206886828701611fb1565b925050604061207986828701611efc565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f8401126120a8576120a7612083565b5b8235905067ffffffffffffffff8111156120c5576120c4612088565b5b6020830191508360018202830111156120e1576120e061208d565b5b9250929050565b600080602083850312156120ff576120fe611d64565b5b600083013567ffffffffffffffff81111561211d5761211c611d69565b5b61212985828601612092565b92509250509250929050565b60006020828403121561214b5761214a611d64565b5b600061215984828501611fb1565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61219a82611e6f565b810181811067ffffffffffffffff821117156121b9576121b8612162565b5b80604052505050565b60006121cc611d5a565b90506121d88282612191565b919050565b600067ffffffffffffffff8211156121f8576121f7612162565b5b602082029050602081019050919050565b600061221c612217846121dd565b6121c2565b9050808382526020820190506020840283018581111561223f5761223e61208d565b5b835b8181101561226857806122548882611fb1565b845260208401935050602081019050612241565b5050509392505050565b600082601f83011261228757612286612083565b5b8135612297848260208601612209565b91505092915050565b6000602082840312156122b6576122b5611d64565b5b600082013567ffffffffffffffff8111156122d4576122d3611d69565b5b6122e084828501612272565b91505092915050565b6122f281611df3565b81146122fd57600080fd5b50565b60008135905061230f816122e9565b92915050565b6000806040838503121561232c5761232b611d64565b5b600061233a85828601611fb1565b925050602061234b85828601612300565b9150509250929050565b600080fd5b600067ffffffffffffffff82111561237557612374612162565b5b61237e82611e6f565b9050602081019050919050565b82818337600083830152505050565b60006123ad6123a88461235a565b6121c2565b9050828152602081018484840111156123c9576123c8612355565b5b6123d484828561238b565b509392505050565b600082601f8301126123f1576123f0612083565b5b813561240184826020860161239a565b91505092915050565b6000806000806080858703121561242457612423611d64565b5b600061243287828801611fb1565b945050602061244387828801611fb1565b935050604061245487828801611efc565b925050606085013567ffffffffffffffff81111561247557612474611d69565b5b612481878288016123dc565b91505092959194509250565b600080604083850312156124a4576124a3611d64565b5b60006124b285828601611fb1565b92505060206124c385828601611fb1565b9150509250929050565b600067ffffffffffffffff8211156124e8576124e7612162565b5b6124f182611e6f565b9050602081019050919050565b600061251161250c846124cd565b6121c2565b90508281526020810184848401111561252d5761252c612355565b5b61253884828561238b565b509392505050565b600082601f83011261255557612554612083565b5b81356125658482602086016124fe565b91505092915050565b60006020828403121561258457612583611d64565b5b600082013567ffffffffffffffff8111156125a2576125a1611d69565b5b6125ae84828501612540565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806125fe57607f821691505b602082108103612611576126106125b7565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061264d602083611e34565b915061265882612617565b602082019050919050565b6000602082019050818103600083015261267c81612640565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026126f07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826126b3565b6126fa86836126b3565b95508019841693508086168417925050509392505050565b6000819050919050565b600061273761273261272d84611edb565b612712565b611edb565b9050919050565b6000819050919050565b6127518361271c565b61276561275d8261273e565b8484546126c0565b825550505050565b600090565b61277a61276d565b612785818484612748565b505050565b5b818110156127a95761279e600082612772565b60018101905061278b565b5050565b601f8211156127ee576127bf8161268e565b6127c8846126a3565b810160208510156127d7578190505b6127eb6127e3856126a3565b83018261278a565b50505b505050565b600082821c905092915050565b6000612811600019846008026127f3565b1980831691505092915050565b600061282a8383612800565b9150826002028217905092915050565b6128448383612683565b67ffffffffffffffff81111561285d5761285c612162565b5b61286782546125e6565b6128728282856127ad565b6000601f8311600181146128a1576000841561288f578287013590505b612899858261281e565b865550612901565b601f1984166128af8661268e565b60005b828110156128d7578489013582556001820191506020850194506020810190506128b2565b868310156128f457848901356128f0601f891682612800565b8355505b6001600288020188555050505b50505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061294482611edb565b915061294f83611edb565b92508282019050808211156129675761296661290a565b5b92915050565b7f4e6f7420656e6f75676820746f6b656e73206c65667421000000000000000000600082015250565b60006129a3601783611e34565b91506129ae8261296d565b602082019050919050565b600060208201905081810360008301526129d281612996565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000612a1382611edb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612a4557612a4461290a565b5b600182019050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000612aac602f83611e34565b9150612ab782612a50565b604082019050919050565b60006020820190508181036000830152612adb81612a9f565b9050919050565b600081905092915050565b6000612af882611e29565b612b028185612ae2565b9350612b12818560208601611e45565b80840191505092915050565b6000612b2a8285612aed565b9150612b368284612aed565b91508190509392505050565b612b4b82611e29565b67ffffffffffffffff811115612b6457612b63612162565b5b612b6e82546125e6565b612b798282856127ad565b600060209050601f831160018114612bac5760008415612b9a578287015190505b612ba4858261281e565b865550612c0c565b601f198416612bba8661268e565b60005b82811015612be257848901518255600182019150602085019450602081019050612bbd565b86831015612bff5784890151612bfb601f891682612800565b8355505b6001600288020188555050505b505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612c70602683611e34565b9150612c7b82612c14565b604082019050919050565b60006020820190508181036000830152612c9f81612c63565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000612ccd82612ca6565b612cd78185612cb1565b9350612ce7818560208601611e45565b612cf081611e6f565b840191505092915050565b6000608082019050612d106000830187611f70565b612d1d6020830186611f70565b612d2a6040830185612006565b8181036060830152612d3c8184612cc2565b905095945050505050565b600081519050612d5681611d9a565b92915050565b600060208284031215612d7257612d71611d64565b5b6000612d8084828501612d47565b9150509291505056fea26469706673582212202baad1b5c2aa70a96fbc370d7081cf42a4163f3a3209144d72a37d193321682c64736f6c63430008110033
Deployed Bytecode Sourcemap
48389:1686:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18047:615;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23766:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25720:212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25260:394;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17077:323;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35033:2800;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48500:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49967:105;;;:::i;:::-;;26618:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48983:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49422:106;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23547:152;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18726:232;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2618:103;;;:::i;:::-;;48619:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1967:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23935:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26004:308;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48548:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49221:75;;;:::i;:::-;;26874:399;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49534:412;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26383:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49089:126;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2876:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18047:615;18132:4;18447:10;18432:25;;:11;:25;;;;:102;;;;18524:10;18509:25;;:11;:25;;;;18432:102;:179;;;;18601:10;18586:25;;:11;:25;;;;18432:179;18412:199;;18047:615;;;:::o;23766:100::-;23820:13;23853:5;23846:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23766:100;:::o;25720:212::-;25796:7;25821:16;25829:7;25821;:16::i;:::-;25816:64;;25846:34;;;;;;;;;;;;;;25816:64;25900:15;:24;25916:7;25900:24;;;;;;;;;;;;;;;;;;;;;25893:31;;25720:212;;;:::o;25260:394::-;25341:13;25357:16;25365:7;25357;:16::i;:::-;25341:32;;25413:5;25390:28;;:19;:17;:19::i;:::-;:28;;;25386:175;;25438:44;25455:5;25462:19;:17;:19::i;:::-;25438:16;:44::i;:::-;25433:128;;25510:35;;;;;;;;;;;;;;25433:128;25386:175;25600:2;25573:15;:24;25589:7;25573:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;25638:7;25634:2;25618:28;;25627:5;25618:28;;;;;;;;;;;;25330:324;25260:394;;:::o;17077:323::-;17138:7;17366:15;:13;:15::i;:::-;17351:12;;17335:13;;:28;:46;17328:53;;17077:323;:::o;35033:2800::-;35167:27;35197;35216:7;35197:18;:27::i;:::-;35167:57;;35282:4;35241:45;;35257:19;35241:45;;;35237:86;;35295:28;;;;;;;;;;;;;;35237:86;35337:27;35366:23;35393:28;35413:7;35393:19;:28::i;:::-;35336:85;;;;35521:62;35540:15;35557:4;35563:19;:17;:19::i;:::-;35521:18;:62::i;:::-;35516:174;;35603:43;35620:4;35626:19;:17;:19::i;:::-;35603:16;:43::i;:::-;35598:92;;35655:35;;;;;;;;;;;;;;35598:92;35516:174;35721:1;35707:16;;:2;:16;;;35703:52;;35732:23;;;;;;;;;;;;;;35703:52;35768:43;35790:4;35796:2;35800:7;35809:1;35768:21;:43::i;:::-;35904:15;35901:160;;;36044:1;36023:19;36016:30;35901:160;36439:18;:24;36458:4;36439:24;;;;;;;;;;;;;;;;36437:26;;;;;;;;;;;;36508:18;:22;36527:2;36508:22;;;;;;;;;;;;;;;;36506:24;;;;;;;;;;;36830:145;36867:2;36915:45;36930:4;36936:2;36940:19;36915:14;:45::i;:::-;14297:8;36888:72;36830:18;:145::i;:::-;36801:17;:26;36819:7;36801:26;;;;;;;;;;;:174;;;;37145:1;14297:8;37095:19;:46;:51;37091:626;;37167:19;37199:1;37189:7;:11;37167:33;;37356:1;37322:17;:30;37340:11;37322:30;;;;;;;;;;;;:35;37318:384;;37460:13;;37445:11;:28;37441:242;;37640:19;37607:17;:30;37625:11;37607:30;;;;;;;;;;;:52;;;;37441:242;37318:384;37148:569;37091:626;37764:7;37760:2;37745:27;;37754:4;37745:27;;;;;;;;;;;;37783:42;37804:4;37810:2;37814:7;37823:1;37783:20;:42::i;:::-;35156:2677;;;35033:2800;;;:::o;48500:41::-;;;:::o;49967:105::-;2198:12;:10;:12::i;:::-;2187:23;;:7;:5;:7::i;:::-;:23;;;2179:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50024:7:::1;:5;:7::i;:::-;50016:25;;:48;50042:21;50016:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;49967:105::o:0;26618:185::-;26756:39;26773:4;26779:2;26783:7;26756:39;;;;;;;;;;;;:16;:39::i;:::-;26618:185;;;:::o;48983:28::-;;;;;;;;;;;;;:::o;49422:106::-;2198:12;:10;:12::i;:::-;2187:23;;:7;:5;:7::i;:::-;:23;;;2179:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49513:7:::1;;49497:13;:23;;;;;;;:::i;:::-;;49422:106:::0;;:::o;23547:152::-;23619:7;23662:27;23681:7;23662:18;:27::i;:::-;23639:52;;23547:152;;;:::o;18726:232::-;18798:7;18839:1;18822:19;;:5;:19;;;18818:60;;18850:28;;;;;;;;;;;;;;18818:60;13249:13;18896:18;:25;18915:5;18896:25;;;;;;;;;;;;;;;;:54;18889:61;;18726:232;;;:::o;2618:103::-;2198:12;:10;:12::i;:::-;2187:23;;:7;:5;:7::i;:::-;:23;;;2179:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2683:30:::1;2710:1;2683:18;:30::i;:::-;2618:103::o:0;48619:339::-;2198:12;:10;:12::i;:::-;2187:23;;:7;:5;:7::i;:::-;:23;;;2179:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48696:17:::1;48716:9;:16;48696:36;;48778:10;48765:9;48751:11;;:23;;;;:::i;:::-;:37;;48743:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;48831:9;48826:92;48850:9;48846:1;:13;48826:92;;;48881:25;48891:9;48901:1;48891:12;;;;;;;;:::i;:::-;;;;;;;;48904:1;48881:9;:25::i;:::-;48861:3;;;;;:::i;:::-;;;;48826:92;;;;48941:9;48928:11;;:22;;;;;;;:::i;:::-;;;;;;;;48685:273;48619:339:::0;:::o;1967:87::-;2013:7;2040:6;;;;;;;;;;;2033:13;;1967:87;:::o;23935:104::-;23991:13;24024:7;24017:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23935:104;:::o;26004:308::-;26115:19;:17;:19::i;:::-;26103:31;;:8;:31;;;26099:61;;26143:17;;;;;;;;;;;;;;26099:61;26225:8;26173:18;:39;26192:19;:17;:19::i;:::-;26173:39;;;;;;;;;;;;;;;:49;26213:8;26173:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;26285:8;26249:55;;26264:19;:17;:19::i;:::-;26249:55;;;26295:8;26249:55;;;;;;:::i;:::-;;;;;;;;26004:308;;:::o;48548:30::-;;;;:::o;49221:75::-;2198:12;:10;:12::i;:::-;2187:23;;:7;:5;:7::i;:::-;:23;;;2179:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49284:4:::1;49273:8;;:15;;;;;;;;;;;;;;;;;;49221:75::o:0;26874:399::-;27041:31;27054:4;27060:2;27064:7;27041:12;:31::i;:::-;27105:1;27087:2;:14;;;:19;27083:183;;27126:56;27157:4;27163:2;27167:7;27176:5;27126:30;:56::i;:::-;27121:145;;27210:40;;;;;;;;;;;;;;27121:145;27083:183;26874:399;;;;:::o;49534:412::-;49607:13;49641:16;49649:7;49641;:16::i;:::-;49633:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;49719:21;49743:10;:8;:10::i;:::-;49719:34;;49779:5;49767:17;;:8;;;;;;;;;;;:17;;;49764:70;;49808:14;49801:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49764:70;49876:1;49857:7;49851:21;:26;:87;;;;;;;;;;;;;;;;;49904:7;49913:18;49923:7;49913:9;:18::i;:::-;49887:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49851:87;49844:94;;;49534:412;;;;:::o;26383:164::-;26480:4;26504:18;:25;26523:5;26504:25;;;;;;;;;;;;;;;:35;26530:8;26504:35;;;;;;;;;;;;;;;;;;;;;;;;;26497:42;;26383:164;;;;:::o;49089:126::-;2198:12;:10;:12::i;:::-;2187:23;;:7;:5;:7::i;:::-;:23;;;2179:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49192:15:::1;49175:14;:32;;;;;;:::i;:::-;;49089:126:::0;:::o;2876:201::-;2198:12;:10;:12::i;:::-;2187:23;;:7;:5;:7::i;:::-;:23;;;2179:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2985:1:::1;2965:22;;:8;:22;;::::0;2957:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3041:28;3060:8;3041:18;:28::i;:::-;2876:201:::0;:::o;27528:281::-;27593:4;27649:7;27630:15;:13;:15::i;:::-;:26;;:66;;;;;27683:13;;27673:7;:23;27630:66;:152;;;;;27781:1;14019:8;27734:17;:26;27752:7;27734:26;;;;;;;;;;;;:43;:48;27630:152;27610:172;;27528:281;;;:::o;46137:105::-;46197:7;46224:10;46217:17;;46137:105;:::o;16593:92::-;16649:7;16593:92;:::o;20440:1129::-;20507:7;20527:12;20542:7;20527:22;;20610:4;20591:15;:13;:15::i;:::-;:23;20587:915;;20644:13;;20637:4;:20;20633:869;;;20682:14;20699:17;:23;20717:4;20699:23;;;;;;;;;;;;20682:40;;20815:1;14019:8;20788:6;:23;:28;20784:699;;21307:113;21324:1;21314:6;:11;21307:113;;21367:17;:25;21385:6;;;;;;;21367:25;;;;;;;;;;;;21358:34;;21307:113;;;21453:6;21446:13;;;;;;20784:699;20659:843;20633:869;20587:915;21530:31;;;;;;;;;;;;;;20440:1129;;;;:::o;33369:652::-;33464:27;33493:23;33534:53;33590:15;33534:71;;33776:7;33770:4;33763:21;33811:22;33805:4;33798:36;33887:4;33881;33871:21;33848:44;;33983:19;33977:26;33958:45;;33714:300;33369:652;;;:::o;34134:645::-;34276:11;34438:15;34432:4;34428:26;34420:34;;34597:15;34586:9;34582:31;34569:44;;34744:15;34733:9;34730:30;34723:4;34712:9;34709:19;34706:55;34696:65;;34134:645;;;;;:::o;44970:159::-;;;;;:::o;43282:309::-;43417:7;43437:16;14420:3;43463:19;:40;;43437:67;;14420:3;43530:31;43541:4;43547:2;43551:9;43530:10;:31::i;:::-;43522:40;;:61;;43515:68;;;43282:309;;;;;:::o;23038:447::-;23118:14;23286:15;23279:5;23275:27;23266:36;;23460:5;23446:11;23422:22;23418:40;23415:51;23408:5;23405:62;23395:72;;23038:447;;;;:::o;45788:158::-;;;;;:::o;685:98::-;738:7;765:10;758:17;;685:98;:::o;3237:191::-;3311:16;3330:6;;;;;;;;;;;3311:25;;3356:8;3347:6;;:17;;;;;;;;;;;;;;;;;;3411:8;3380:40;;3401:8;3380:40;;;;;;;;;;;;3300:128;3237:191;:::o;27893:112::-;27970:27;27980:2;27984:8;27970:27;;;;;;;;;;;;:9;:27::i;:::-;27893:112;;:::o;41784:716::-;41947:4;41993:2;41968:45;;;42014:19;:17;:19::i;:::-;42035:4;42041:7;42050:5;41968:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41964:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42268:1;42251:6;:13;:18;42247:235;;42297:40;;;;;;;;;;;;;;42247:235;42440:6;42434:13;42425:6;42421:2;42417:15;42410:38;41964:529;42137:54;;;42127:64;;;:6;:64;;;;42120:71;;;41784:716;;;;;;:::o;49302:114::-;49362:13;49395;49388:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49302:114;:::o;46348:1968::-;46413:17;46832:3;46825:4;46819:11;46815:21;46808:28;;46923:3;46917:4;46910:17;47029:3;47485:5;47615:1;47610:3;47606:11;47599:18;;47752:2;47746:4;47742:13;47738:2;47734:22;47729:3;47721:36;47793:2;47787:4;47783:13;47775:21;;47377:697;47812:4;47377:697;;;48003:1;47998:3;47994:11;47987:18;;48054:2;48048:4;48044:13;48040:2;48036:22;48031:3;48023:36;47907:2;47901:4;47897:13;47889:21;;47377:697;;;47381:430;48113:3;48108;48104:13;48228:2;48223:3;48219:12;48212:19;;48291:6;48286:3;48279:19;46452:1857;;46348:1968;;;:::o;44167:147::-;44304:6;44167:147;;;;;:::o;28421:689::-;28552:19;28558:2;28562:8;28552:5;:19::i;:::-;28631:1;28613:2;:14;;;:19;28609:483;;28653:11;28667:13;;28653:27;;28699:13;28721:8;28715:3;:14;28699:30;;28748:233;28779:62;28818:1;28822:2;28826:7;;;;;;28835:5;28779:30;:62::i;:::-;28774:167;;28877:40;;;;;;;;;;;;;;28774:167;28976:3;28968:5;:11;28748:233;;29063:3;29046:13;;:20;29042:34;;29068:8;;;29042:34;28634:458;;28609:483;28421:689;;;:::o;29383:1537::-;29456:20;29479:13;;29456:36;;29521:1;29507:16;;:2;:16;;;29503:48;;29532:19;;;;;;;;;;;;;;29503:48;29578:1;29566:8;:13;29562:44;;29588:18;;;;;;;;;;;;;;29562:44;29619:61;29649:1;29653:2;29657:12;29671:8;29619:21;:61::i;:::-;30162:1;13386:2;30133:1;:25;;30132:31;30120:8;:44;30094:18;:22;30113:2;30094:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;30441:139;30478:2;30532:33;30555:1;30559:2;30563:1;30532:14;:33::i;:::-;30499:30;30520:8;30499:20;:30::i;:::-;:66;30441:18;:139::i;:::-;30407:17;:31;30425:12;30407:31;;;;;;;;;;;:173;;;;30597:15;30615:12;30597:30;;30642:11;30671:8;30656:12;:23;30642:37;;30694:101;30746:9;;;;;;30742:2;30721:35;;30738:1;30721:35;;;;;;;;;;;;30790:3;30780:7;:13;30694:101;;30827:3;30811:13;:19;;;;29868:974;;30852:60;30881:1;30885:2;30889:12;30903:8;30852:20;:60::i;:::-;29445:1475;29383:1537;;:::o;24876:322::-;24946:14;25177:1;25167:8;25164:15;25139:23;25135:45;25125:55;;24876:322;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:117::-;5976:1;5973;5966:12;5990:117;6099:1;6096;6089:12;6113:117;6222:1;6219;6212:12;6250:553;6308:8;6318:6;6368:3;6361:4;6353:6;6349:17;6345:27;6335:122;;6376:79;;:::i;:::-;6335:122;6489:6;6476:20;6466:30;;6519:18;6511:6;6508:30;6505:117;;;6541:79;;:::i;:::-;6505:117;6655:4;6647:6;6643:17;6631:29;;6709:3;6701:4;6693:6;6689:17;6679:8;6675:32;6672:41;6669:128;;;6716:79;;:::i;:::-;6669:128;6250:553;;;;;:::o;6809:529::-;6880:6;6888;6937:2;6925:9;6916:7;6912:23;6908:32;6905:119;;;6943:79;;:::i;:::-;6905:119;7091:1;7080:9;7076:17;7063:31;7121:18;7113:6;7110:30;7107:117;;;7143:79;;:::i;:::-;7107:117;7256:65;7313:7;7304:6;7293:9;7289:22;7256:65;:::i;:::-;7238:83;;;;7034:297;6809:529;;;;;:::o;7344:329::-;7403:6;7452:2;7440:9;7431:7;7427:23;7423:32;7420:119;;;7458:79;;:::i;:::-;7420:119;7578:1;7603:53;7648:7;7639:6;7628:9;7624:22;7603:53;:::i;:::-;7593:63;;7549:117;7344:329;;;;:::o;7679:180::-;7727:77;7724:1;7717:88;7824:4;7821:1;7814:15;7848:4;7845:1;7838:15;7865:281;7948:27;7970:4;7948:27;:::i;:::-;7940:6;7936:40;8078:6;8066:10;8063:22;8042:18;8030:10;8027:34;8024:62;8021:88;;;8089:18;;:::i;:::-;8021:88;8129:10;8125:2;8118:22;7908:238;7865:281;;:::o;8152:129::-;8186:6;8213:20;;:::i;:::-;8203:30;;8242:33;8270:4;8262:6;8242:33;:::i;:::-;8152:129;;;:::o;8287:311::-;8364:4;8454:18;8446:6;8443:30;8440:56;;;8476:18;;:::i;:::-;8440:56;8526:4;8518:6;8514:17;8506:25;;8586:4;8580;8576:15;8568:23;;8287:311;;;:::o;8621:710::-;8717:5;8742:81;8758:64;8815:6;8758:64;:::i;:::-;8742:81;:::i;:::-;8733:90;;8843:5;8872:6;8865:5;8858:21;8906:4;8899:5;8895:16;8888:23;;8959:4;8951:6;8947:17;8939:6;8935:30;8988:3;8980:6;8977:15;8974:122;;;9007:79;;:::i;:::-;8974:122;9122:6;9105:220;9139:6;9134:3;9131:15;9105:220;;;9214:3;9243:37;9276:3;9264:10;9243:37;:::i;:::-;9238:3;9231:50;9310:4;9305:3;9301:14;9294:21;;9181:144;9165:4;9160:3;9156:14;9149:21;;9105:220;;;9109:21;8723:608;;8621:710;;;;;:::o;9354:370::-;9425:5;9474:3;9467:4;9459:6;9455:17;9451:27;9441:122;;9482:79;;:::i;:::-;9441:122;9599:6;9586:20;9624:94;9714:3;9706:6;9699:4;9691:6;9687:17;9624:94;:::i;:::-;9615:103;;9431:293;9354:370;;;;:::o;9730:539::-;9814:6;9863:2;9851:9;9842:7;9838:23;9834:32;9831:119;;;9869:79;;:::i;:::-;9831:119;10017:1;10006:9;10002:17;9989:31;10047:18;10039:6;10036:30;10033:117;;;10069:79;;:::i;:::-;10033:117;10174:78;10244:7;10235:6;10224:9;10220:22;10174:78;:::i;:::-;10164:88;;9960:302;9730:539;;;;:::o;10275:116::-;10345:21;10360:5;10345:21;:::i;:::-;10338:5;10335:32;10325:60;;10381:1;10378;10371:12;10325:60;10275:116;:::o;10397:133::-;10440:5;10478:6;10465:20;10456:29;;10494:30;10518:5;10494:30;:::i;:::-;10397:133;;;;:::o;10536:468::-;10601:6;10609;10658:2;10646:9;10637:7;10633:23;10629:32;10626:119;;;10664:79;;:::i;:::-;10626:119;10784:1;10809:53;10854:7;10845:6;10834:9;10830:22;10809:53;:::i;:::-;10799:63;;10755:117;10911:2;10937:50;10979:7;10970:6;10959:9;10955:22;10937:50;:::i;:::-;10927:60;;10882:115;10536:468;;;;;:::o;11010:117::-;11119:1;11116;11109:12;11133:307;11194:4;11284:18;11276:6;11273:30;11270:56;;;11306:18;;:::i;:::-;11270:56;11344:29;11366:6;11344:29;:::i;:::-;11336:37;;11428:4;11422;11418:15;11410:23;;11133:307;;;:::o;11446:146::-;11543:6;11538:3;11533;11520:30;11584:1;11575:6;11570:3;11566:16;11559:27;11446:146;;;:::o;11598:423::-;11675:5;11700:65;11716:48;11757:6;11716:48;:::i;:::-;11700:65;:::i;:::-;11691:74;;11788:6;11781:5;11774:21;11826:4;11819:5;11815:16;11864:3;11855:6;11850:3;11846:16;11843:25;11840:112;;;11871:79;;:::i;:::-;11840:112;11961:54;12008:6;12003:3;11998;11961:54;:::i;:::-;11681:340;11598:423;;;;;:::o;12040:338::-;12095:5;12144:3;12137:4;12129:6;12125:17;12121:27;12111:122;;12152:79;;:::i;:::-;12111:122;12269:6;12256:20;12294:78;12368:3;12360:6;12353:4;12345:6;12341:17;12294:78;:::i;:::-;12285:87;;12101:277;12040:338;;;;:::o;12384:943::-;12479:6;12487;12495;12503;12552:3;12540:9;12531:7;12527:23;12523:33;12520:120;;;12559:79;;:::i;:::-;12520:120;12679:1;12704:53;12749:7;12740:6;12729:9;12725:22;12704:53;:::i;:::-;12694:63;;12650:117;12806:2;12832:53;12877:7;12868:6;12857:9;12853:22;12832:53;:::i;:::-;12822:63;;12777:118;12934:2;12960:53;13005:7;12996:6;12985:9;12981:22;12960:53;:::i;:::-;12950:63;;12905:118;13090:2;13079:9;13075:18;13062:32;13121:18;13113:6;13110:30;13107:117;;;13143:79;;:::i;:::-;13107:117;13248:62;13302:7;13293:6;13282:9;13278:22;13248:62;:::i;:::-;13238:72;;13033:287;12384:943;;;;;;;:::o;13333:474::-;13401:6;13409;13458:2;13446:9;13437:7;13433:23;13429:32;13426:119;;;13464:79;;:::i;:::-;13426:119;13584:1;13609:53;13654:7;13645:6;13634:9;13630:22;13609:53;:::i;:::-;13599:63;;13555:117;13711:2;13737:53;13782:7;13773:6;13762:9;13758:22;13737:53;:::i;:::-;13727:63;;13682:118;13333:474;;;;;:::o;13813:308::-;13875:4;13965:18;13957:6;13954:30;13951:56;;;13987:18;;:::i;:::-;13951:56;14025:29;14047:6;14025:29;:::i;:::-;14017:37;;14109:4;14103;14099:15;14091:23;;13813:308;;;:::o;14127:425::-;14205:5;14230:66;14246:49;14288:6;14246:49;:::i;:::-;14230:66;:::i;:::-;14221:75;;14319:6;14312:5;14305:21;14357:4;14350:5;14346:16;14395:3;14386:6;14381:3;14377:16;14374:25;14371:112;;;14402:79;;:::i;:::-;14371:112;14492:54;14539:6;14534:3;14529;14492:54;:::i;:::-;14211:341;14127:425;;;;;:::o;14572:340::-;14628:5;14677:3;14670:4;14662:6;14658:17;14654:27;14644:122;;14685:79;;:::i;:::-;14644:122;14802:6;14789:20;14827:79;14902:3;14894:6;14887:4;14879:6;14875:17;14827:79;:::i;:::-;14818:88;;14634:278;14572:340;;;;:::o;14918:509::-;14987:6;15036:2;15024:9;15015:7;15011:23;15007:32;15004:119;;;15042:79;;:::i;:::-;15004:119;15190:1;15179:9;15175:17;15162:31;15220:18;15212:6;15209:30;15206:117;;;15242:79;;:::i;:::-;15206:117;15347:63;15402:7;15393:6;15382:9;15378:22;15347:63;:::i;:::-;15337:73;;15133:287;14918:509;;;;:::o;15433:180::-;15481:77;15478:1;15471:88;15578:4;15575:1;15568:15;15602:4;15599:1;15592:15;15619:320;15663:6;15700:1;15694:4;15690:12;15680:22;;15747:1;15741:4;15737:12;15768:18;15758:81;;15824:4;15816:6;15812:17;15802:27;;15758:81;15886:2;15878:6;15875:14;15855:18;15852:38;15849:84;;15905:18;;:::i;:::-;15849:84;15670:269;15619:320;;;:::o;15945:182::-;16085:34;16081:1;16073:6;16069:14;16062:58;15945:182;:::o;16133:366::-;16275:3;16296:67;16360:2;16355:3;16296:67;:::i;:::-;16289:74;;16372:93;16461:3;16372:93;:::i;:::-;16490:2;16485:3;16481:12;16474:19;;16133:366;;;:::o;16505:419::-;16671:4;16709:2;16698:9;16694:18;16686:26;;16758:9;16752:4;16748:20;16744:1;16733:9;16729:17;16722:47;16786:131;16912:4;16786:131;:::i;:::-;16778:139;;16505:419;;;:::o;16930:97::-;16989:6;17017:3;17007:13;;16930:97;;;;:::o;17033:141::-;17082:4;17105:3;17097:11;;17128:3;17125:1;17118:14;17162:4;17159:1;17149:18;17141:26;;17033:141;;;:::o;17180:93::-;17217:6;17264:2;17259;17252:5;17248:14;17244:23;17234:33;;17180:93;;;:::o;17279:107::-;17323:8;17373:5;17367:4;17363:16;17342:37;;17279:107;;;;:::o;17392:393::-;17461:6;17511:1;17499:10;17495:18;17534:97;17564:66;17553:9;17534:97;:::i;:::-;17652:39;17682:8;17671:9;17652:39;:::i;:::-;17640:51;;17724:4;17720:9;17713:5;17709:21;17700:30;;17773:4;17763:8;17759:19;17752:5;17749:30;17739:40;;17468:317;;17392:393;;;;;:::o;17791:60::-;17819:3;17840:5;17833:12;;17791:60;;;:::o;17857:142::-;17907:9;17940:53;17958:34;17967:24;17985:5;17967:24;:::i;:::-;17958:34;:::i;:::-;17940:53;:::i;:::-;17927:66;;17857:142;;;:::o;18005:75::-;18048:3;18069:5;18062:12;;18005:75;;;:::o;18086:269::-;18196:39;18227:7;18196:39;:::i;:::-;18257:91;18306:41;18330:16;18306:41;:::i;:::-;18298:6;18291:4;18285:11;18257:91;:::i;:::-;18251:4;18244:105;18162:193;18086:269;;;:::o;18361:73::-;18406:3;18361:73;:::o;18440:189::-;18517:32;;:::i;:::-;18558:65;18616:6;18608;18602:4;18558:65;:::i;:::-;18493:136;18440:189;;:::o;18635:186::-;18695:120;18712:3;18705:5;18702:14;18695:120;;;18766:39;18803:1;18796:5;18766:39;:::i;:::-;18739:1;18732:5;18728:13;18719:22;;18695:120;;;18635:186;;:::o;18827:543::-;18928:2;18923:3;18920:11;18917:446;;;18962:38;18994:5;18962:38;:::i;:::-;19046:29;19064:10;19046:29;:::i;:::-;19036:8;19032:44;19229:2;19217:10;19214:18;19211:49;;;19250:8;19235:23;;19211:49;19273:80;19329:22;19347:3;19329:22;:::i;:::-;19319:8;19315:37;19302:11;19273:80;:::i;:::-;18932:431;;18917:446;18827:543;;;:::o;19376:117::-;19430:8;19480:5;19474:4;19470:16;19449:37;;19376:117;;;;:::o;19499:169::-;19543:6;19576:51;19624:1;19620:6;19612:5;19609:1;19605:13;19576:51;:::i;:::-;19572:56;19657:4;19651;19647:15;19637:25;;19550:118;19499:169;;;;:::o;19673:295::-;19749:4;19895:29;19920:3;19914:4;19895:29;:::i;:::-;19887:37;;19957:3;19954:1;19950:11;19944:4;19941:21;19933:29;;19673:295;;;;:::o;19973:1403::-;20097:44;20137:3;20132;20097:44;:::i;:::-;20206:18;20198:6;20195:30;20192:56;;;20228:18;;:::i;:::-;20192:56;20272:38;20304:4;20298:11;20272:38;:::i;:::-;20357:67;20417:6;20409;20403:4;20357:67;:::i;:::-;20451:1;20480:2;20472:6;20469:14;20497:1;20492:632;;;;21168:1;21185:6;21182:84;;;21241:9;21236:3;21232:19;21219:33;21210:42;;21182:84;21292:67;21352:6;21345:5;21292:67;:::i;:::-;21286:4;21279:81;21141:229;20462:908;;20492:632;20544:4;20540:9;20532:6;20528:22;20578:37;20610:4;20578:37;:::i;:::-;20637:1;20651:215;20665:7;20662:1;20659:14;20651:215;;;20751:9;20746:3;20742:19;20729:33;20721:6;20714:49;20802:1;20794:6;20790:14;20780:24;;20849:2;20838:9;20834:18;20821:31;;20688:4;20685:1;20681:12;20676:17;;20651:215;;;20894:6;20885:7;20882:19;20879:186;;;20959:9;20954:3;20950:19;20937:33;21002:48;21044:4;21036:6;21032:17;21021:9;21002:48;:::i;:::-;20994:6;20987:64;20902:163;20879:186;21111:1;21107;21099:6;21095:14;21091:22;21085:4;21078:36;20499:625;;;20462:908;;20072:1304;;;19973:1403;;;:::o;21382:180::-;21430:77;21427:1;21420:88;21527:4;21524:1;21517:15;21551:4;21548:1;21541:15;21568:191;21608:3;21627:20;21645:1;21627:20;:::i;:::-;21622:25;;21661:20;21679:1;21661:20;:::i;:::-;21656:25;;21704:1;21701;21697:9;21690:16;;21725:3;21722:1;21719:10;21716:36;;;21732:18;;:::i;:::-;21716:36;21568:191;;;;:::o;21765:173::-;21905:25;21901:1;21893:6;21889:14;21882:49;21765:173;:::o;21944:366::-;22086:3;22107:67;22171:2;22166:3;22107:67;:::i;:::-;22100:74;;22183:93;22272:3;22183:93;:::i;:::-;22301:2;22296:3;22292:12;22285:19;;21944:366;;;:::o;22316:419::-;22482:4;22520:2;22509:9;22505:18;22497:26;;22569:9;22563:4;22559:20;22555:1;22544:9;22540:17;22533:47;22597:131;22723:4;22597:131;:::i;:::-;22589:139;;22316:419;;;:::o;22741:180::-;22789:77;22786:1;22779:88;22886:4;22883:1;22876:15;22910:4;22907:1;22900:15;22927:233;22966:3;22989:24;23007:5;22989:24;:::i;:::-;22980:33;;23035:66;23028:5;23025:77;23022:103;;23105:18;;:::i;:::-;23022:103;23152:1;23145:5;23141:13;23134:20;;22927:233;;;:::o;23166:234::-;23306:34;23302:1;23294:6;23290:14;23283:58;23375:17;23370:2;23362:6;23358:15;23351:42;23166:234;:::o;23406:366::-;23548:3;23569:67;23633:2;23628:3;23569:67;:::i;:::-;23562:74;;23645:93;23734:3;23645:93;:::i;:::-;23763:2;23758:3;23754:12;23747:19;;23406:366;;;:::o;23778:419::-;23944:4;23982:2;23971:9;23967:18;23959:26;;24031:9;24025:4;24021:20;24017:1;24006:9;24002:17;23995:47;24059:131;24185:4;24059:131;:::i;:::-;24051:139;;23778:419;;;:::o;24203:148::-;24305:11;24342:3;24327:18;;24203:148;;;;:::o;24357:390::-;24463:3;24491:39;24524:5;24491:39;:::i;:::-;24546:89;24628:6;24623:3;24546:89;:::i;:::-;24539:96;;24644:65;24702:6;24697:3;24690:4;24683:5;24679:16;24644:65;:::i;:::-;24734:6;24729:3;24725:16;24718:23;;24467:280;24357:390;;;;:::o;24753:435::-;24933:3;24955:95;25046:3;25037:6;24955:95;:::i;:::-;24948:102;;25067:95;25158:3;25149:6;25067:95;:::i;:::-;25060:102;;25179:3;25172:10;;24753:435;;;;;:::o;25194:1395::-;25311:37;25344:3;25311:37;:::i;:::-;25413:18;25405:6;25402:30;25399:56;;;25435:18;;:::i;:::-;25399:56;25479:38;25511:4;25505:11;25479:38;:::i;:::-;25564:67;25624:6;25616;25610:4;25564:67;:::i;:::-;25658:1;25682:4;25669:17;;25714:2;25706:6;25703:14;25731:1;25726:618;;;;26388:1;26405:6;26402:77;;;26454:9;26449:3;26445:19;26439:26;26430:35;;26402:77;26505:67;26565:6;26558:5;26505:67;:::i;:::-;26499:4;26492:81;26361:222;25696:887;;25726:618;25778:4;25774:9;25766:6;25762:22;25812:37;25844:4;25812:37;:::i;:::-;25871:1;25885:208;25899:7;25896:1;25893:14;25885:208;;;25978:9;25973:3;25969:19;25963:26;25955:6;25948:42;26029:1;26021:6;26017:14;26007:24;;26076:2;26065:9;26061:18;26048:31;;25922:4;25919:1;25915:12;25910:17;;25885:208;;;26121:6;26112:7;26109:19;26106:179;;;26179:9;26174:3;26170:19;26164:26;26222:48;26264:4;26256:6;26252:17;26241:9;26222:48;:::i;:::-;26214:6;26207:64;26129:156;26106:179;26331:1;26327;26319:6;26315:14;26311:22;26305:4;26298:36;25733:611;;;25696:887;;25286:1303;;;25194:1395;;:::o;26595:225::-;26735:34;26731:1;26723:6;26719:14;26712:58;26804:8;26799:2;26791:6;26787:15;26780:33;26595:225;:::o;26826:366::-;26968:3;26989:67;27053:2;27048:3;26989:67;:::i;:::-;26982:74;;27065:93;27154:3;27065:93;:::i;:::-;27183:2;27178:3;27174:12;27167:19;;26826:366;;;:::o;27198:419::-;27364:4;27402:2;27391:9;27387:18;27379:26;;27451:9;27445:4;27441:20;27437:1;27426:9;27422:17;27415:47;27479:131;27605:4;27479:131;:::i;:::-;27471:139;;27198:419;;;:::o;27623:98::-;27674:6;27708:5;27702:12;27692:22;;27623:98;;;:::o;27727:168::-;27810:11;27844:6;27839:3;27832:19;27884:4;27879:3;27875:14;27860:29;;27727:168;;;;:::o;27901:373::-;27987:3;28015:38;28047:5;28015:38;:::i;:::-;28069:70;28132:6;28127:3;28069:70;:::i;:::-;28062:77;;28148:65;28206:6;28201:3;28194:4;28187:5;28183:16;28148:65;:::i;:::-;28238:29;28260:6;28238:29;:::i;:::-;28233:3;28229:39;28222:46;;27991:283;27901:373;;;;:::o;28280:640::-;28475:4;28513:3;28502:9;28498:19;28490:27;;28527:71;28595:1;28584:9;28580:17;28571:6;28527:71;:::i;:::-;28608:72;28676:2;28665:9;28661:18;28652:6;28608:72;:::i;:::-;28690;28758:2;28747:9;28743:18;28734:6;28690:72;:::i;:::-;28809:9;28803:4;28799:20;28794:2;28783:9;28779:18;28772:48;28837:76;28908:4;28899:6;28837:76;:::i;:::-;28829:84;;28280:640;;;;;;;:::o;28926:141::-;28982:5;29013:6;29007:13;28998:22;;29029:32;29055:5;29029:32;:::i;:::-;28926:141;;;;:::o;29073:349::-;29142:6;29191:2;29179:9;29170:7;29166:23;29162:32;29159:119;;;29197:79;;:::i;:::-;29159:119;29317:1;29342:63;29397:7;29388:6;29377:9;29373:22;29342:63;:::i;:::-;29332:73;;29288:127;29073:349;;;;:::o
Swarm Source
ipfs://2baad1b5c2aa70a96fbc370d7081cf42a4163f3a3209144d72a37d193321682c
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.