ERC-721
Overview
Max Total Supply
801 CPS
Holders
265
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 CPSLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Cattonap
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-12-31 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/security/Pausable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (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 Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: operator-filter-registry/src/IOperatorFilterRegistry.sol pragma solidity ^0.8.13; interface IOperatorFilterRegistry { function isOperatorAllowed(address registrant, address operator) external view returns (bool); function register(address registrant) external; function registerAndSubscribe(address registrant, address subscription) external; function registerAndCopyEntries(address registrant, address registrantToCopy) external; function unregister(address addr) external; function updateOperator(address registrant, address operator, bool filtered) external; function updateOperators(address registrant, address[] calldata operators, bool filtered) external; function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; function subscribe(address registrant, address registrantToSubscribe) external; function unsubscribe(address registrant, bool copyExistingEntries) external; function subscriptionOf(address addr) external returns (address registrant); function subscribers(address registrant) external returns (address[] memory); function subscriberAt(address registrant, uint256 index) external returns (address); function copyEntriesOf(address registrant, address registrantToCopy) external; function isOperatorFiltered(address registrant, address operator) external returns (bool); function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); function filteredOperators(address addr) external returns (address[] memory); function filteredCodeHashes(address addr) external returns (bytes32[] memory); function filteredOperatorAt(address registrant, uint256 index) external returns (address); function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); function isRegistered(address addr) external returns (bool); function codeHashOf(address addr) external returns (bytes32); } // File: operator-filter-registry/src/OperatorFilterer.sol pragma solidity ^0.8.13; /** * @title OperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. */ abstract contract OperatorFilterer { error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } modifier onlyAllowedOperator(address from) virtual { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from != msg.sender) { _checkFilterOperator(msg.sender); } _; } modifier onlyAllowedOperatorApproval(address operator) virtual { _checkFilterOperator(operator); _; } function _checkFilterOperator(address operator) internal view virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } } } // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external payable; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) public payable virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } } // File: erc721a/contracts/extensions/IERC721AQueryable.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721AQueryable. */ interface IERC721AQueryable is IERC721A { /** * Invalid query range (`start` >= `stop`). */ error InvalidQueryRange(); /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * * - `addr = address(0)` * - `startTimestamp = 0` * - `burned = false` * - `extraData = 0` * * If the `tokenId` is burned: * * - `addr = <Address of owner before token was burned>` * - `startTimestamp = <Timestamp when token was burned>` * - `burned = true` * - `extraData = <Extra data when token was burned>` * * Otherwise: * * - `addr = <Address of owner>` * - `startTimestamp = <Timestamp of start of ownership>` * - `burned = false` * - `extraData = <Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory); /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory); /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start < stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view returns (uint256[] memory); /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(`totalSupply`) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K collections should be fine). */ function tokensOfOwner(address owner) external view returns (uint256[] memory); } // File: erc721a/contracts/extensions/ERC721AQueryable.sol // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @title ERC721AQueryable. * * @dev ERC721A subclass with convenience query functions. */ abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable { /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * * - `addr = address(0)` * - `startTimestamp = 0` * - `burned = false` * - `extraData = 0` * * If the `tokenId` is burned: * * - `addr = <Address of owner before token was burned>` * - `startTimestamp = <Timestamp when token was burned>` * - `burned = true` * - `extraData = <Extra data when token was burned>` * * Otherwise: * * - `addr = <Address of owner>` * - `startTimestamp = <Timestamp of start of ownership>` * - `burned = false` * - `extraData = <Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) public view virtual override returns (TokenOwnership memory) { TokenOwnership memory ownership; if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) { return ownership; } ownership = _ownershipAt(tokenId); if (ownership.burned) { return ownership; } return _ownershipOf(tokenId); } /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] calldata tokenIds) external view virtual override returns (TokenOwnership[] memory) { unchecked { uint256 tokenIdsLength = tokenIds.length; TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength); for (uint256 i; i != tokenIdsLength; ++i) { ownerships[i] = explicitOwnershipOf(tokenIds[i]); } return ownerships; } } /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start < stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view virtual override returns (uint256[] memory) { unchecked { if (start >= stop) revert InvalidQueryRange(); uint256 tokenIdsIdx; uint256 stopLimit = _nextTokenId(); // Set `start = max(start, _startTokenId())`. if (start < _startTokenId()) { start = _startTokenId(); } // Set `stop = min(stop, stopLimit)`. if (stop > stopLimit) { stop = stopLimit; } uint256 tokenIdsMaxLength = balanceOf(owner); // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`, // to cater for cases where `balanceOf(owner)` is too big. if (start < stop) { uint256 rangeLength = stop - start; if (rangeLength < tokenIdsMaxLength) { tokenIdsMaxLength = rangeLength; } } else { tokenIdsMaxLength = 0; } uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength); if (tokenIdsMaxLength == 0) { return tokenIds; } // We need to call `explicitOwnershipOf(start)`, // because the slot at `start` may not be initialized. TokenOwnership memory ownership = explicitOwnershipOf(start); address currOwnershipAddr; // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`. // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range. if (!ownership.burned) { currOwnershipAddr = ownership.addr; } for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } // Downsize the array to fit. assembly { mstore(tokenIds, tokenIdsIdx) } return tokenIds; } } /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(`totalSupply`) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K collections should be fine). */ function tokensOfOwner(address owner) external view virtual override returns (uint256[] memory) { unchecked { uint256 tokenIdsIdx; address currOwnershipAddr; uint256 tokenIdsLength = balanceOf(owner); uint256[] memory tokenIds = new uint256[](tokenIdsLength); TokenOwnership memory ownership; for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } return tokenIds; } } } // File: contracts/Cattopillars.sol pragma solidity ^0.8.13; /* ____ _ _____ _____ U ___ u ____ _ _ _ ____ ____ U /"___|U /"\ u |_ " _| |_ " _| \/"_ \/U| _"\ u ___ |"| |"| U /"\ uU | _"\ u / __"| u \| | u \/ _ \/ | | | | | | | |\| |_) |/ |_"_| U | | u U | | u \/ _ \/ \| |_) |/<\___ \/ | |/__ / ___ \ /| |\ /| |\.-,_| |_| | | __/ | | \| |/__ \| |/__ / ___ \ | _ < u___) | \____|/_/ \_\ u |_|U u |_|U \_)-\___/ |_| U/| |\u |_____| |_____|/_/ \_\ |_| \_\ |____/>> _// \\ \\ >> _// \\_ _// \\_ \\ ||>>_.-,_|___|_,-.// \\ // \\ \\ >> // \\_ )( (__) (__)(__)(__) (__)(__) (__)(__) (__) (__) (__)__)\_)-' '-(_/(_")("_)(_")("_)(__) (__)(__) (__)(__) */ contract Cattonap is ERC721AQueryable, Ownable, Pausable, ReentrancyGuard, OperatorFilterer { uint256 public mintPrice = 0.008 ether; uint256 public constant MAX_SUPPLY = 800; mapping(address => bool) public filteredAddress; string private _baseTokenURI; modifier onlyEOA() { require(msg.sender == tx.origin, "Only EOA wallets can mint"); _; } constructor() ERC721A("Cattopillars", "CPS") OperatorFilterer( address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6), true ) { filteredAddress[0x00000000000111AbE46ff893f3B2fdF1F759a8A8] = true; filteredAddress[0xf42aa99F011A1fA7CDA90E5E98b277E306BcA83e] = true; _pause(); } function mint() external payable nonReentrant onlyEOA whenNotPaused { require(_numberMinted(msg.sender) <= 3, "Over max mint per wallet"); require(msg.value >= mintPrice, "Insufficient ETH"); require(_totalMinted() + 1 <= MAX_SUPPLY, "Over max supply"); _mint(msg.sender, 3); } function reserveMint() external onlyOwner { require(_numberMinted(owner()) <= 9, "Over max reserve mint"); _mint(owner(), 9); } function setBaseURI(string calldata baseURI) external onlyOwner { _baseTokenURI = baseURI; } function setFilteredAddress(address _address, bool _isFiltered) external onlyOwner { filteredAddress[_address] = _isFiltered; } function setMintPrice(uint256 _newPrice) external onlyOwner { mintPrice = _newPrice; } function setPause() external onlyOwner { if (paused()) _unpause(); else _pause(); } function withdraw() external onlyOwner { payable(msg.sender).transfer(address(this).balance); } function transferFrom( address from, address to, uint256 tokenId ) public payable override(ERC721A, IERC721A) onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom( address from, address to, uint256 tokenId ) public payable override(ERC721A, IERC721A) onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public payable override(ERC721A, IERC721A) onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } function approve(address to, uint256 tokenId) public payable override(ERC721A, IERC721A) { require(!filteredAddress[to], "Not allowed to approve to this address"); super.approve(to, tokenId); } function setApprovalForAll(address operator, bool approved) public override(ERC721A, IERC721A) { require( !filteredAddress[operator], "Not allowed to approval this address" ); super.setApprovalForAll(operator, approved); } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A, IERC721A) returns (bool) { return ERC721A.supportsInterface(interfaceId); } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"filteredAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_isFiltered","type":"bool"}],"name":"setFilteredAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","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
6080604052661c6bf526340000600a553480156200001c57600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600c81526020017f436174746f70696c6c61727300000000000000000000000000000000000000008152506040518060400160405280600381526020017f43505300000000000000000000000000000000000000000000000000000000008152508160029080519060200190620000b8929190620005c1565b508060039080519060200190620000d1929190620005c1565b50620000e26200040d60201b60201c565b60008190555050506200010a620000fe6200041260201b60201c565b6200041a60201b60201c565b6000600860146101000a81548160ff021916908315150217905550600160098190555060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111562000322578015620001e8576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b8152600401620001ae929190620006b6565b600060405180830381600087803b158015620001c957600080fd5b505af1158015620001de573d6000803e3d6000fd5b5050505062000321565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620002a2576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b815260040162000268929190620006b6565b600060405180830381600087803b1580156200028357600080fd5b505af115801562000298573d6000803e3d6000fd5b5050505062000320565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620002eb9190620006e3565b600060405180830381600087803b1580156200030657600080fd5b505af11580156200031b573d6000803e3d6000fd5b505050505b5b5b50506001600b60006e0111abe46ff893f3b2fdf1f759a8a873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600b600073f42aa99f011a1fa7cda90e5e98b277e306bca83e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555062000407620004e060201b60201c565b620007e7565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620004f06200055560201b60201c565b6001600860146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586200053c6200041260201b60201c565b6040516200054b9190620006e3565b60405180910390a1565b62000565620005aa60201b60201c565b15620005a8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200059f9062000761565b60405180910390fd5b565b6000600860149054906101000a900460ff16905090565b828054620005cf90620007b2565b90600052602060002090601f016020900481019282620005f357600085556200063f565b82601f106200060e57805160ff19168380011785556200063f565b828001600101855582156200063f579182015b828111156200063e57825182559160200191906001019062000621565b5b5090506200064e919062000652565b5090565b5b808211156200066d57600081600090555060010162000653565b5090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200069e8262000671565b9050919050565b620006b08162000691565b82525050565b6000604082019050620006cd6000830185620006a5565b620006dc6020830184620006a5565b9392505050565b6000602082019050620006fa6000830184620006a5565b92915050565b600082825260208201905092915050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006200074960108362000700565b9150620007568262000711565b602082019050919050565b600060208201905081810360008301526200077c816200073a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620007cb57607f821691505b602082108103620007e157620007e062000783565b5b50919050565b613c3680620007f76000396000f3fe6080604052600436106101ee5760003560e01c80636352211e1161010d578063a22cb465116100a0578063d431b1ac1161006f578063d431b1ac146106be578063e6444282146106d5578063e985e9c5146106fe578063f2fde38b1461073b578063f4a0a52814610764576101ee565b8063a22cb465146105ff578063b88d4fde14610628578063c23dc68f14610644578063c87b56dd14610681576101ee565b80638462151c116100dc5780638462151c1461052f5780638da5cb5b1461056c57806395d89b411461059757806399a2557a146105c2576101ee565b80636352211e146104735780636817c76c146104b057806370a08231146104db578063715018a614610518576101ee565b806323b872dd1161018557806342842e0e1161015457806342842e0e146103c657806355f804b3146103e25780635bbb21771461040b5780635c975abb14610448576101ee565b806323b872dd1461033d57806332cb6b0c146103595780633ccfd60b1461038457806341f434341461039b576101ee565b80631249c58b116101c15780631249c58b146102b4578063147757f9146102be57806318160ddd146102fb57806321c8d67614610326576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190612973565b61078d565b60405161022791906129bb565b60405180910390f35b34801561023c57600080fd5b5061024561079f565b6040516102529190612a6f565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190612ac7565b610831565b60405161028f9190612b35565b60405180910390f35b6102b260048036038101906102ad9190612b7c565b6108b0565b005b6102bc61094b565b005b3480156102ca57600080fd5b506102e560048036038101906102e09190612bbc565b610ac7565b6040516102f291906129bb565b60405180910390f35b34801561030757600080fd5b50610310610ae7565b60405161031d9190612bf8565b60405180910390f35b34801561033257600080fd5b5061033b610afe565b005b61035760048036038101906103529190612c13565b610b6d565b005b34801561036557600080fd5b5061036e610bbc565b60405161037b9190612bf8565b60405180910390f35b34801561039057600080fd5b50610399610bc2565b005b3480156103a757600080fd5b506103b0610c13565b6040516103bd9190612cc5565b60405180910390f35b6103e060048036038101906103db9190612c13565b610c25565b005b3480156103ee57600080fd5b5061040960048036038101906104049190612d45565b610c74565b005b34801561041757600080fd5b50610432600480360381019061042d9190612de8565b610c92565b60405161043f9190612f98565b60405180910390f35b34801561045457600080fd5b5061045d610d55565b60405161046a91906129bb565b60405180910390f35b34801561047f57600080fd5b5061049a60048036038101906104959190612ac7565b610d6c565b6040516104a79190612b35565b60405180910390f35b3480156104bc57600080fd5b506104c5610d7e565b6040516104d29190612bf8565b60405180910390f35b3480156104e757600080fd5b5061050260048036038101906104fd9190612bbc565b610d84565b60405161050f9190612bf8565b60405180910390f35b34801561052457600080fd5b5061052d610e3c565b005b34801561053b57600080fd5b5061055660048036038101906105519190612bbc565b610e50565b6040516105639190613078565b60405180910390f35b34801561057857600080fd5b50610581610f93565b60405161058e9190612b35565b60405180910390f35b3480156105a357600080fd5b506105ac610fbd565b6040516105b99190612a6f565b60405180910390f35b3480156105ce57600080fd5b506105e960048036038101906105e4919061309a565b61104f565b6040516105f69190613078565b60405180910390f35b34801561060b57600080fd5b5061062660048036038101906106219190613119565b61125b565b005b610642600480360381019061063d9190613289565b6112f6565b005b34801561065057600080fd5b5061066b60048036038101906106669190612ac7565b611347565b6040516106789190613361565b60405180910390f35b34801561068d57600080fd5b506106a860048036038101906106a39190612ac7565b6113b1565b6040516106b59190612a6f565b60405180910390f35b3480156106ca57600080fd5b506106d361144f565b005b3480156106e157600080fd5b506106fc60048036038101906106f79190613119565b61147c565b005b34801561070a57600080fd5b506107256004803603810190610720919061337c565b6114df565b60405161073291906129bb565b60405180910390f35b34801561074757600080fd5b50610762600480360381019061075d9190612bbc565b611573565b005b34801561077057600080fd5b5061078b60048036038101906107869190612ac7565b6115f6565b005b600061079882611608565b9050919050565b6060600280546107ae906133eb565b80601f01602080910402602001604051908101604052809291908181526020018280546107da906133eb565b80156108275780601f106107fc57610100808354040283529160200191610827565b820191906000526020600020905b81548152906001019060200180831161080a57829003601f168201915b5050505050905090565b600061083c8261169a565b610872576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561093d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109349061348e565b60405180910390fd5b61094782826116f9565b5050565b61095361183d565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b8906134fa565b60405180910390fd5b6109c961188c565b60036109d4336118d6565b1115610a15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0c90613566565b60405180910390fd5b600a54341015610a5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a51906135d2565b60405180910390fd5b6103206001610a6761192d565b610a719190613621565b1115610ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa9906136c3565b60405180910390fd5b610abd336003611940565b610ac5611afb565b565b600b6020528060005260406000206000915054906101000a900460ff1681565b6000610af1611b05565b6001546000540303905090565b610b06611b0a565b6009610b18610b13610f93565b6118d6565b1115610b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b509061372f565b60405180910390fd5b610b6b610b64610f93565b6009611940565b565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610bab57610baa33611b88565b5b610bb6848484611c85565b50505050565b61032081565b610bca611b0a565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610c10573d6000803e3d6000fd5b50565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c6357610c6233611b88565b5b610c6e848484611fa7565b50505050565b610c7c611b0a565b8181600c9190610c8d929190612815565b505050565b6060600083839050905060008167ffffffffffffffff811115610cb857610cb761315e565b5b604051908082528060200260200182016040528015610cf157816020015b610cde61289b565b815260200190600190039081610cd65790505b50905060005b828114610d4957610d20868683818110610d1457610d1361374f565b5b90506020020135611347565b828281518110610d3357610d3261374f565b5b6020026020010181905250806001019050610cf7565b50809250505092915050565b6000600860149054906101000a900460ff16905090565b6000610d7782611fc7565b9050919050565b600a5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610deb576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610e44611b0a565b610e4e6000612093565b565b60606000806000610e6085610d84565b905060008167ffffffffffffffff811115610e7e57610e7d61315e565b5b604051908082528060200260200182016040528015610eac5781602001602082028036833780820191505090505b509050610eb761289b565b6000610ec1611b05565b90505b838614610f8557610ed481612159565b91508160400151610f7a57600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614610f1f57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610f795780838780600101985081518110610f6c57610f6b61374f565b5b6020026020010181815250505b5b806001019050610ec4565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610fcc906133eb565b80601f0160208091040260200160405190810160405280929190818152602001828054610ff8906133eb565b80156110455780601f1061101a57610100808354040283529160200191611045565b820191906000526020600020905b81548152906001019060200180831161102857829003601f168201915b5050505050905090565b606081831061108a576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611095612184565b905061109f611b05565b8510156110b1576110ae611b05565b94505b808411156110bd578093505b60006110c887610d84565b9050848610156110eb5760008686039050818110156110e5578091505b506110f0565b600090505b60008167ffffffffffffffff81111561110c5761110b61315e565b5b60405190808252806020026020018201604052801561113a5781602001602082028036833780820191505090505b509050600082036111515780945050505050611254565b600061115c88611347565b90506000816040015161117157816000015190505b60008990505b8881141580156111875750848714155b156112465761119581612159565b9250826040015161123b57600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff16146111e057826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361123a578084888060010199508151811061122d5761122c61374f565b5b6020026020010181815250505b5b806001019050611177565b508583528296505050505050505b9392505050565b600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156112e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112df906137f0565b60405180910390fd5b6112f2828261218d565b5050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146113345761133333611b88565b5b61134085858585612298565b5050505050565b61134f61289b565b61135761289b565b61135f611b05565b831080611373575061136f612184565b8310155b1561138157809150506113ac565b61138a83612159565b905080604001511561139f57809150506113ac565b6113a88361230b565b9150505b919050565b60606113bc8261169a565b6113f2576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006113fc61232b565b9050600081510361141c5760405180602001604052806000815250611447565b80611426846123bd565b60405160200161143792919061384c565b6040516020818303038152906040525b915050919050565b611457611b0a565b61145f610d55565b156114715761146c61240d565b61147a565b611479612470565b5b565b611484611b0a565b80600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61157b611b0a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036115ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e1906138e2565b60405180910390fd5b6115f381612093565b50565b6115fe611b0a565b80600a8190555050565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061166357506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806116935750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6000816116a5611b05565b111580156116b4575060005482105b80156116f2575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600061170482610d6c565b90508073ffffffffffffffffffffffffffffffffffffffff166117256124d3565b73ffffffffffffffffffffffffffffffffffffffff1614611788576117518161174c6124d3565b6114df565b611787576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600260095403611882576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118799061394e565b60405180910390fd5b6002600981905550565b611894610d55565b156118d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cb906139ba565b60405180910390fd5b565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b6000611937611b05565b60005403905090565b60008054905060008203611980576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61198d60008483856124db565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611a04836119f560008660006124e1565b6119fe85612509565b17612519565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114611aa557808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611a6a565b5060008203611ae0576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050611af66000848385612544565b505050565b6001600981905550565b600090565b611b1261254a565b73ffffffffffffffffffffffffffffffffffffffff16611b30610f93565b73ffffffffffffffffffffffffffffffffffffffff1614611b86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7d90613a26565b60405180910390fd5b565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611c82576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611bff929190613a46565b602060405180830381865afa158015611c1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c409190613a84565b611c8157806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611c789190612b35565b60405180910390fd5b5b50565b6000611c9082611fc7565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611cf7576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611d0384612552565b91509150611d198187611d146124d3565b612579565b611d6557611d2e86611d296124d3565b6114df565b611d64576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611dcb576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611dd886868660016124db565b8015611de357600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611eb185611e8d8888876124e1565b7c020000000000000000000000000000000000000000000000000000000017612519565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603611f375760006001850190506000600460008381526020019081526020016000205403611f35576000548114611f34578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f9f8686866001612544565b505050505050565b611fc2838383604051806020016040528060008152506112f6565b505050565b60008082905080611fd6611b05565b1161205c5760005481101561205b5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612059575b6000810361204f576004600083600190039350838152602001908152602001600020549050612025565b809250505061208e565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61216161289b565b61217d60046000848152602001908152602001600020546125bd565b9050919050565b60008054905090565b806007600061219a6124d3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166122476124d3565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161228c91906129bb565b60405180910390a35050565b6122a3848484610b6d565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612305576122ce84848484612673565b612304576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b61231361289b565b61232461231f83611fc7565b6125bd565b9050919050565b6060600c805461233a906133eb565b80601f0160208091040260200160405190810160405280929190818152602001828054612366906133eb565b80156123b35780601f10612388576101008083540402835291602001916123b3565b820191906000526020600020905b81548152906001019060200180831161239657829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b6001156123f857600184039350600a81066030018453600a81049050806123d6575b50828103602084039350808452505050919050565b6124156127c3565b6000600860146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61245961254a565b6040516124669190612b35565b60405180910390a1565b61247861188c565b6001600860146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586124bc61254a565b6040516124c99190612b35565b60405180910390a1565b600033905090565b50505050565b60008060e883901c905060e86124f886868461280c565b62ffffff16901b9150509392505050565b60006001821460e11b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b6125c561289b565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126996124d3565b8786866040518563ffffffff1660e01b81526004016126bb9493929190613b06565b6020604051808303816000875af19250505080156126f757506040513d601f19601f820116820180604052508101906126f49190613b67565b60015b612770573d8060008114612727576040519150601f19603f3d011682016040523d82523d6000602084013e61272c565b606091505b506000815103612768576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6127cb610d55565b61280a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280190613be0565b60405180910390fd5b565b60009392505050565b828054612821906133eb565b90600052602060002090601f016020900481019282612843576000855561288a565b82601f1061285c57803560ff191683800117855561288a565b8280016001018555821561288a579182015b8281111561288957823582559160200191906001019061286e565b5b50905061289791906128ea565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b808211156129035760008160009055506001016128eb565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6129508161291b565b811461295b57600080fd5b50565b60008135905061296d81612947565b92915050565b60006020828403121561298957612988612911565b5b60006129978482850161295e565b91505092915050565b60008115159050919050565b6129b5816129a0565b82525050565b60006020820190506129d060008301846129ac565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612a105780820151818401526020810190506129f5565b83811115612a1f576000848401525b50505050565b6000601f19601f8301169050919050565b6000612a41826129d6565b612a4b81856129e1565b9350612a5b8185602086016129f2565b612a6481612a25565b840191505092915050565b60006020820190508181036000830152612a898184612a36565b905092915050565b6000819050919050565b612aa481612a91565b8114612aaf57600080fd5b50565b600081359050612ac181612a9b565b92915050565b600060208284031215612add57612adc612911565b5b6000612aeb84828501612ab2565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612b1f82612af4565b9050919050565b612b2f81612b14565b82525050565b6000602082019050612b4a6000830184612b26565b92915050565b612b5981612b14565b8114612b6457600080fd5b50565b600081359050612b7681612b50565b92915050565b60008060408385031215612b9357612b92612911565b5b6000612ba185828601612b67565b9250506020612bb285828601612ab2565b9150509250929050565b600060208284031215612bd257612bd1612911565b5b6000612be084828501612b67565b91505092915050565b612bf281612a91565b82525050565b6000602082019050612c0d6000830184612be9565b92915050565b600080600060608486031215612c2c57612c2b612911565b5b6000612c3a86828701612b67565b9350506020612c4b86828701612b67565b9250506040612c5c86828701612ab2565b9150509250925092565b6000819050919050565b6000612c8b612c86612c8184612af4565b612c66565b612af4565b9050919050565b6000612c9d82612c70565b9050919050565b6000612caf82612c92565b9050919050565b612cbf81612ca4565b82525050565b6000602082019050612cda6000830184612cb6565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112612d0557612d04612ce0565b5b8235905067ffffffffffffffff811115612d2257612d21612ce5565b5b602083019150836001820283011115612d3e57612d3d612cea565b5b9250929050565b60008060208385031215612d5c57612d5b612911565b5b600083013567ffffffffffffffff811115612d7a57612d79612916565b5b612d8685828601612cef565b92509250509250929050565b60008083601f840112612da857612da7612ce0565b5b8235905067ffffffffffffffff811115612dc557612dc4612ce5565b5b602083019150836020820283011115612de157612de0612cea565b5b9250929050565b60008060208385031215612dff57612dfe612911565b5b600083013567ffffffffffffffff811115612e1d57612e1c612916565b5b612e2985828601612d92565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612e6a81612b14565b82525050565b600067ffffffffffffffff82169050919050565b612e8d81612e70565b82525050565b612e9c816129a0565b82525050565b600062ffffff82169050919050565b612eba81612ea2565b82525050565b608082016000820151612ed66000850182612e61565b506020820151612ee96020850182612e84565b506040820151612efc6040850182612e93565b506060820151612f0f6060850182612eb1565b50505050565b6000612f218383612ec0565b60808301905092915050565b6000602082019050919050565b6000612f4582612e35565b612f4f8185612e40565b9350612f5a83612e51565b8060005b83811015612f8b578151612f728882612f15565b9750612f7d83612f2d565b925050600181019050612f5e565b5085935050505092915050565b60006020820190508181036000830152612fb28184612f3a565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612fef81612a91565b82525050565b60006130018383612fe6565b60208301905092915050565b6000602082019050919050565b600061302582612fba565b61302f8185612fc5565b935061303a83612fd6565b8060005b8381101561306b5781516130528882612ff5565b975061305d8361300d565b92505060018101905061303e565b5085935050505092915050565b60006020820190508181036000830152613092818461301a565b905092915050565b6000806000606084860312156130b3576130b2612911565b5b60006130c186828701612b67565b93505060206130d286828701612ab2565b92505060406130e386828701612ab2565b9150509250925092565b6130f6816129a0565b811461310157600080fd5b50565b600081359050613113816130ed565b92915050565b600080604083850312156131305761312f612911565b5b600061313e85828601612b67565b925050602061314f85828601613104565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61319682612a25565b810181811067ffffffffffffffff821117156131b5576131b461315e565b5b80604052505050565b60006131c8612907565b90506131d4828261318d565b919050565b600067ffffffffffffffff8211156131f4576131f361315e565b5b6131fd82612a25565b9050602081019050919050565b82818337600083830152505050565b600061322c613227846131d9565b6131be565b90508281526020810184848401111561324857613247613159565b5b61325384828561320a565b509392505050565b600082601f8301126132705761326f612ce0565b5b8135613280848260208601613219565b91505092915050565b600080600080608085870312156132a3576132a2612911565b5b60006132b187828801612b67565b94505060206132c287828801612b67565b93505060406132d387828801612ab2565b925050606085013567ffffffffffffffff8111156132f4576132f3612916565b5b6133008782880161325b565b91505092959194509250565b6080820160008201516133226000850182612e61565b5060208201516133356020850182612e84565b5060408201516133486040850182612e93565b50606082015161335b6060850182612eb1565b50505050565b6000608082019050613376600083018461330c565b92915050565b6000806040838503121561339357613392612911565b5b60006133a185828601612b67565b92505060206133b285828601612b67565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061340357607f821691505b602082108103613416576134156133bc565b5b50919050565b7f4e6f7420616c6c6f77656420746f20617070726f766520746f2074686973206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006134786026836129e1565b91506134838261341c565b604082019050919050565b600060208201905081810360008301526134a78161346b565b9050919050565b7f4f6e6c7920454f412077616c6c6574732063616e206d696e7400000000000000600082015250565b60006134e46019836129e1565b91506134ef826134ae565b602082019050919050565b60006020820190508181036000830152613513816134d7565b9050919050565b7f4f766572206d6178206d696e74207065722077616c6c65740000000000000000600082015250565b60006135506018836129e1565b915061355b8261351a565b602082019050919050565b6000602082019050818103600083015261357f81613543565b9050919050565b7f496e73756666696369656e742045544800000000000000000000000000000000600082015250565b60006135bc6010836129e1565b91506135c782613586565b602082019050919050565b600060208201905081810360008301526135eb816135af565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061362c82612a91565b915061363783612a91565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561366c5761366b6135f2565b5b828201905092915050565b7f4f766572206d617820737570706c790000000000000000000000000000000000600082015250565b60006136ad600f836129e1565b91506136b882613677565b602082019050919050565b600060208201905081810360008301526136dc816136a0565b9050919050565b7f4f766572206d61782072657365727665206d696e740000000000000000000000600082015250565b60006137196015836129e1565b9150613724826136e3565b602082019050919050565b600060208201905081810360008301526137488161370c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e6f7420616c6c6f77656420746f20617070726f76616c20746869732061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006137da6024836129e1565b91506137e58261377e565b604082019050919050565b60006020820190508181036000830152613809816137cd565b9050919050565b600081905092915050565b6000613826826129d6565b6138308185613810565b93506138408185602086016129f2565b80840191505092915050565b6000613858828561381b565b9150613864828461381b565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006138cc6026836129e1565b91506138d782613870565b604082019050919050565b600060208201905081810360008301526138fb816138bf565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613938601f836129e1565b915061394382613902565b602082019050919050565b600060208201905081810360008301526139678161392b565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006139a46010836129e1565b91506139af8261396e565b602082019050919050565b600060208201905081810360008301526139d381613997565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613a106020836129e1565b9150613a1b826139da565b602082019050919050565b60006020820190508181036000830152613a3f81613a03565b9050919050565b6000604082019050613a5b6000830185612b26565b613a686020830184612b26565b9392505050565b600081519050613a7e816130ed565b92915050565b600060208284031215613a9a57613a99612911565b5b6000613aa884828501613a6f565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000613ad882613ab1565b613ae28185613abc565b9350613af28185602086016129f2565b613afb81612a25565b840191505092915050565b6000608082019050613b1b6000830187612b26565b613b286020830186612b26565b613b356040830185612be9565b8181036060830152613b478184613acd565b905095945050505050565b600081519050613b6181612947565b92915050565b600060208284031215613b7d57613b7c612911565b5b6000613b8b84828501613b52565b91505092915050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000613bca6014836129e1565b9150613bd582613b94565b602082019050919050565b60006020820190508181036000830152613bf981613bbd565b905091905056fea264697066735822122080b73351f15b381e7405add4d3f201a430d1706bfcefa6ed0334628098ef94c664736f6c634300080d0033
Deployed Bytecode
0x6080604052600436106101ee5760003560e01c80636352211e1161010d578063a22cb465116100a0578063d431b1ac1161006f578063d431b1ac146106be578063e6444282146106d5578063e985e9c5146106fe578063f2fde38b1461073b578063f4a0a52814610764576101ee565b8063a22cb465146105ff578063b88d4fde14610628578063c23dc68f14610644578063c87b56dd14610681576101ee565b80638462151c116100dc5780638462151c1461052f5780638da5cb5b1461056c57806395d89b411461059757806399a2557a146105c2576101ee565b80636352211e146104735780636817c76c146104b057806370a08231146104db578063715018a614610518576101ee565b806323b872dd1161018557806342842e0e1161015457806342842e0e146103c657806355f804b3146103e25780635bbb21771461040b5780635c975abb14610448576101ee565b806323b872dd1461033d57806332cb6b0c146103595780633ccfd60b1461038457806341f434341461039b576101ee565b80631249c58b116101c15780631249c58b146102b4578063147757f9146102be57806318160ddd146102fb57806321c8d67614610326576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190612973565b61078d565b60405161022791906129bb565b60405180910390f35b34801561023c57600080fd5b5061024561079f565b6040516102529190612a6f565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190612ac7565b610831565b60405161028f9190612b35565b60405180910390f35b6102b260048036038101906102ad9190612b7c565b6108b0565b005b6102bc61094b565b005b3480156102ca57600080fd5b506102e560048036038101906102e09190612bbc565b610ac7565b6040516102f291906129bb565b60405180910390f35b34801561030757600080fd5b50610310610ae7565b60405161031d9190612bf8565b60405180910390f35b34801561033257600080fd5b5061033b610afe565b005b61035760048036038101906103529190612c13565b610b6d565b005b34801561036557600080fd5b5061036e610bbc565b60405161037b9190612bf8565b60405180910390f35b34801561039057600080fd5b50610399610bc2565b005b3480156103a757600080fd5b506103b0610c13565b6040516103bd9190612cc5565b60405180910390f35b6103e060048036038101906103db9190612c13565b610c25565b005b3480156103ee57600080fd5b5061040960048036038101906104049190612d45565b610c74565b005b34801561041757600080fd5b50610432600480360381019061042d9190612de8565b610c92565b60405161043f9190612f98565b60405180910390f35b34801561045457600080fd5b5061045d610d55565b60405161046a91906129bb565b60405180910390f35b34801561047f57600080fd5b5061049a60048036038101906104959190612ac7565b610d6c565b6040516104a79190612b35565b60405180910390f35b3480156104bc57600080fd5b506104c5610d7e565b6040516104d29190612bf8565b60405180910390f35b3480156104e757600080fd5b5061050260048036038101906104fd9190612bbc565b610d84565b60405161050f9190612bf8565b60405180910390f35b34801561052457600080fd5b5061052d610e3c565b005b34801561053b57600080fd5b5061055660048036038101906105519190612bbc565b610e50565b6040516105639190613078565b60405180910390f35b34801561057857600080fd5b50610581610f93565b60405161058e9190612b35565b60405180910390f35b3480156105a357600080fd5b506105ac610fbd565b6040516105b99190612a6f565b60405180910390f35b3480156105ce57600080fd5b506105e960048036038101906105e4919061309a565b61104f565b6040516105f69190613078565b60405180910390f35b34801561060b57600080fd5b5061062660048036038101906106219190613119565b61125b565b005b610642600480360381019061063d9190613289565b6112f6565b005b34801561065057600080fd5b5061066b60048036038101906106669190612ac7565b611347565b6040516106789190613361565b60405180910390f35b34801561068d57600080fd5b506106a860048036038101906106a39190612ac7565b6113b1565b6040516106b59190612a6f565b60405180910390f35b3480156106ca57600080fd5b506106d361144f565b005b3480156106e157600080fd5b506106fc60048036038101906106f79190613119565b61147c565b005b34801561070a57600080fd5b506107256004803603810190610720919061337c565b6114df565b60405161073291906129bb565b60405180910390f35b34801561074757600080fd5b50610762600480360381019061075d9190612bbc565b611573565b005b34801561077057600080fd5b5061078b60048036038101906107869190612ac7565b6115f6565b005b600061079882611608565b9050919050565b6060600280546107ae906133eb565b80601f01602080910402602001604051908101604052809291908181526020018280546107da906133eb565b80156108275780601f106107fc57610100808354040283529160200191610827565b820191906000526020600020905b81548152906001019060200180831161080a57829003601f168201915b5050505050905090565b600061083c8261169a565b610872576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561093d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109349061348e565b60405180910390fd5b61094782826116f9565b5050565b61095361183d565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b8906134fa565b60405180910390fd5b6109c961188c565b60036109d4336118d6565b1115610a15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0c90613566565b60405180910390fd5b600a54341015610a5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a51906135d2565b60405180910390fd5b6103206001610a6761192d565b610a719190613621565b1115610ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa9906136c3565b60405180910390fd5b610abd336003611940565b610ac5611afb565b565b600b6020528060005260406000206000915054906101000a900460ff1681565b6000610af1611b05565b6001546000540303905090565b610b06611b0a565b6009610b18610b13610f93565b6118d6565b1115610b59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b509061372f565b60405180910390fd5b610b6b610b64610f93565b6009611940565b565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610bab57610baa33611b88565b5b610bb6848484611c85565b50505050565b61032081565b610bca611b0a565b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610c10573d6000803e3d6000fd5b50565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c6357610c6233611b88565b5b610c6e848484611fa7565b50505050565b610c7c611b0a565b8181600c9190610c8d929190612815565b505050565b6060600083839050905060008167ffffffffffffffff811115610cb857610cb761315e565b5b604051908082528060200260200182016040528015610cf157816020015b610cde61289b565b815260200190600190039081610cd65790505b50905060005b828114610d4957610d20868683818110610d1457610d1361374f565b5b90506020020135611347565b828281518110610d3357610d3261374f565b5b6020026020010181905250806001019050610cf7565b50809250505092915050565b6000600860149054906101000a900460ff16905090565b6000610d7782611fc7565b9050919050565b600a5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610deb576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610e44611b0a565b610e4e6000612093565b565b60606000806000610e6085610d84565b905060008167ffffffffffffffff811115610e7e57610e7d61315e565b5b604051908082528060200260200182016040528015610eac5781602001602082028036833780820191505090505b509050610eb761289b565b6000610ec1611b05565b90505b838614610f8557610ed481612159565b91508160400151610f7a57600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614610f1f57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610f795780838780600101985081518110610f6c57610f6b61374f565b5b6020026020010181815250505b5b806001019050610ec4565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610fcc906133eb565b80601f0160208091040260200160405190810160405280929190818152602001828054610ff8906133eb565b80156110455780601f1061101a57610100808354040283529160200191611045565b820191906000526020600020905b81548152906001019060200180831161102857829003601f168201915b5050505050905090565b606081831061108a576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611095612184565b905061109f611b05565b8510156110b1576110ae611b05565b94505b808411156110bd578093505b60006110c887610d84565b9050848610156110eb5760008686039050818110156110e5578091505b506110f0565b600090505b60008167ffffffffffffffff81111561110c5761110b61315e565b5b60405190808252806020026020018201604052801561113a5781602001602082028036833780820191505090505b509050600082036111515780945050505050611254565b600061115c88611347565b90506000816040015161117157816000015190505b60008990505b8881141580156111875750848714155b156112465761119581612159565b9250826040015161123b57600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff16146111e057826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361123a578084888060010199508151811061122d5761122c61374f565b5b6020026020010181815250505b5b806001019050611177565b508583528296505050505050505b9392505050565b600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156112e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112df906137f0565b60405180910390fd5b6112f2828261218d565b5050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146113345761133333611b88565b5b61134085858585612298565b5050505050565b61134f61289b565b61135761289b565b61135f611b05565b831080611373575061136f612184565b8310155b1561138157809150506113ac565b61138a83612159565b905080604001511561139f57809150506113ac565b6113a88361230b565b9150505b919050565b60606113bc8261169a565b6113f2576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006113fc61232b565b9050600081510361141c5760405180602001604052806000815250611447565b80611426846123bd565b60405160200161143792919061384c565b6040516020818303038152906040525b915050919050565b611457611b0a565b61145f610d55565b156114715761146c61240d565b61147a565b611479612470565b5b565b611484611b0a565b80600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61157b611b0a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036115ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e1906138e2565b60405180910390fd5b6115f381612093565b50565b6115fe611b0a565b80600a8190555050565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061166357506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806116935750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6000816116a5611b05565b111580156116b4575060005482105b80156116f2575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600061170482610d6c565b90508073ffffffffffffffffffffffffffffffffffffffff166117256124d3565b73ffffffffffffffffffffffffffffffffffffffff1614611788576117518161174c6124d3565b6114df565b611787576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600260095403611882576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118799061394e565b60405180910390fd5b6002600981905550565b611894610d55565b156118d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cb906139ba565b60405180910390fd5b565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b6000611937611b05565b60005403905090565b60008054905060008203611980576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61198d60008483856124db565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611a04836119f560008660006124e1565b6119fe85612509565b17612519565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114611aa557808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611a6a565b5060008203611ae0576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050611af66000848385612544565b505050565b6001600981905550565b600090565b611b1261254a565b73ffffffffffffffffffffffffffffffffffffffff16611b30610f93565b73ffffffffffffffffffffffffffffffffffffffff1614611b86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7d90613a26565b60405180910390fd5b565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611c82576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611bff929190613a46565b602060405180830381865afa158015611c1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c409190613a84565b611c8157806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611c789190612b35565b60405180910390fd5b5b50565b6000611c9082611fc7565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611cf7576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611d0384612552565b91509150611d198187611d146124d3565b612579565b611d6557611d2e86611d296124d3565b6114df565b611d64576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611dcb576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611dd886868660016124db565b8015611de357600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550611eb185611e8d8888876124e1565b7c020000000000000000000000000000000000000000000000000000000017612519565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603611f375760006001850190506000600460008381526020019081526020016000205403611f35576000548114611f34578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f9f8686866001612544565b505050505050565b611fc2838383604051806020016040528060008152506112f6565b505050565b60008082905080611fd6611b05565b1161205c5760005481101561205b5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612059575b6000810361204f576004600083600190039350838152602001908152602001600020549050612025565b809250505061208e565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61216161289b565b61217d60046000848152602001908152602001600020546125bd565b9050919050565b60008054905090565b806007600061219a6124d3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166122476124d3565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161228c91906129bb565b60405180910390a35050565b6122a3848484610b6d565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612305576122ce84848484612673565b612304576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b61231361289b565b61232461231f83611fc7565b6125bd565b9050919050565b6060600c805461233a906133eb565b80601f0160208091040260200160405190810160405280929190818152602001828054612366906133eb565b80156123b35780601f10612388576101008083540402835291602001916123b3565b820191906000526020600020905b81548152906001019060200180831161239657829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b6001156123f857600184039350600a81066030018453600a81049050806123d6575b50828103602084039350808452505050919050565b6124156127c3565b6000600860146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61245961254a565b6040516124669190612b35565b60405180910390a1565b61247861188c565b6001600860146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586124bc61254a565b6040516124c99190612b35565b60405180910390a1565b600033905090565b50505050565b60008060e883901c905060e86124f886868461280c565b62ffffff16901b9150509392505050565b60006001821460e11b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b6125c561289b565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126996124d3565b8786866040518563ffffffff1660e01b81526004016126bb9493929190613b06565b6020604051808303816000875af19250505080156126f757506040513d601f19601f820116820180604052508101906126f49190613b67565b60015b612770573d8060008114612727576040519150601f19603f3d011682016040523d82523d6000602084013e61272c565b606091505b506000815103612768576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6127cb610d55565b61280a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280190613be0565b60405180910390fd5b565b60009392505050565b828054612821906133eb565b90600052602060002090601f016020900481019282612843576000855561288a565b82601f1061285c57803560ff191683800117855561288a565b8280016001018555821561288a579182015b8281111561288957823582559160200191906001019061286e565b5b50905061289791906128ea565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b808211156129035760008160009055506001016128eb565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6129508161291b565b811461295b57600080fd5b50565b60008135905061296d81612947565b92915050565b60006020828403121561298957612988612911565b5b60006129978482850161295e565b91505092915050565b60008115159050919050565b6129b5816129a0565b82525050565b60006020820190506129d060008301846129ac565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612a105780820151818401526020810190506129f5565b83811115612a1f576000848401525b50505050565b6000601f19601f8301169050919050565b6000612a41826129d6565b612a4b81856129e1565b9350612a5b8185602086016129f2565b612a6481612a25565b840191505092915050565b60006020820190508181036000830152612a898184612a36565b905092915050565b6000819050919050565b612aa481612a91565b8114612aaf57600080fd5b50565b600081359050612ac181612a9b565b92915050565b600060208284031215612add57612adc612911565b5b6000612aeb84828501612ab2565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612b1f82612af4565b9050919050565b612b2f81612b14565b82525050565b6000602082019050612b4a6000830184612b26565b92915050565b612b5981612b14565b8114612b6457600080fd5b50565b600081359050612b7681612b50565b92915050565b60008060408385031215612b9357612b92612911565b5b6000612ba185828601612b67565b9250506020612bb285828601612ab2565b9150509250929050565b600060208284031215612bd257612bd1612911565b5b6000612be084828501612b67565b91505092915050565b612bf281612a91565b82525050565b6000602082019050612c0d6000830184612be9565b92915050565b600080600060608486031215612c2c57612c2b612911565b5b6000612c3a86828701612b67565b9350506020612c4b86828701612b67565b9250506040612c5c86828701612ab2565b9150509250925092565b6000819050919050565b6000612c8b612c86612c8184612af4565b612c66565b612af4565b9050919050565b6000612c9d82612c70565b9050919050565b6000612caf82612c92565b9050919050565b612cbf81612ca4565b82525050565b6000602082019050612cda6000830184612cb6565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112612d0557612d04612ce0565b5b8235905067ffffffffffffffff811115612d2257612d21612ce5565b5b602083019150836001820283011115612d3e57612d3d612cea565b5b9250929050565b60008060208385031215612d5c57612d5b612911565b5b600083013567ffffffffffffffff811115612d7a57612d79612916565b5b612d8685828601612cef565b92509250509250929050565b60008083601f840112612da857612da7612ce0565b5b8235905067ffffffffffffffff811115612dc557612dc4612ce5565b5b602083019150836020820283011115612de157612de0612cea565b5b9250929050565b60008060208385031215612dff57612dfe612911565b5b600083013567ffffffffffffffff811115612e1d57612e1c612916565b5b612e2985828601612d92565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612e6a81612b14565b82525050565b600067ffffffffffffffff82169050919050565b612e8d81612e70565b82525050565b612e9c816129a0565b82525050565b600062ffffff82169050919050565b612eba81612ea2565b82525050565b608082016000820151612ed66000850182612e61565b506020820151612ee96020850182612e84565b506040820151612efc6040850182612e93565b506060820151612f0f6060850182612eb1565b50505050565b6000612f218383612ec0565b60808301905092915050565b6000602082019050919050565b6000612f4582612e35565b612f4f8185612e40565b9350612f5a83612e51565b8060005b83811015612f8b578151612f728882612f15565b9750612f7d83612f2d565b925050600181019050612f5e565b5085935050505092915050565b60006020820190508181036000830152612fb28184612f3a565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612fef81612a91565b82525050565b60006130018383612fe6565b60208301905092915050565b6000602082019050919050565b600061302582612fba565b61302f8185612fc5565b935061303a83612fd6565b8060005b8381101561306b5781516130528882612ff5565b975061305d8361300d565b92505060018101905061303e565b5085935050505092915050565b60006020820190508181036000830152613092818461301a565b905092915050565b6000806000606084860312156130b3576130b2612911565b5b60006130c186828701612b67565b93505060206130d286828701612ab2565b92505060406130e386828701612ab2565b9150509250925092565b6130f6816129a0565b811461310157600080fd5b50565b600081359050613113816130ed565b92915050565b600080604083850312156131305761312f612911565b5b600061313e85828601612b67565b925050602061314f85828601613104565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61319682612a25565b810181811067ffffffffffffffff821117156131b5576131b461315e565b5b80604052505050565b60006131c8612907565b90506131d4828261318d565b919050565b600067ffffffffffffffff8211156131f4576131f361315e565b5b6131fd82612a25565b9050602081019050919050565b82818337600083830152505050565b600061322c613227846131d9565b6131be565b90508281526020810184848401111561324857613247613159565b5b61325384828561320a565b509392505050565b600082601f8301126132705761326f612ce0565b5b8135613280848260208601613219565b91505092915050565b600080600080608085870312156132a3576132a2612911565b5b60006132b187828801612b67565b94505060206132c287828801612b67565b93505060406132d387828801612ab2565b925050606085013567ffffffffffffffff8111156132f4576132f3612916565b5b6133008782880161325b565b91505092959194509250565b6080820160008201516133226000850182612e61565b5060208201516133356020850182612e84565b5060408201516133486040850182612e93565b50606082015161335b6060850182612eb1565b50505050565b6000608082019050613376600083018461330c565b92915050565b6000806040838503121561339357613392612911565b5b60006133a185828601612b67565b92505060206133b285828601612b67565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061340357607f821691505b602082108103613416576134156133bc565b5b50919050565b7f4e6f7420616c6c6f77656420746f20617070726f766520746f2074686973206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006134786026836129e1565b91506134838261341c565b604082019050919050565b600060208201905081810360008301526134a78161346b565b9050919050565b7f4f6e6c7920454f412077616c6c6574732063616e206d696e7400000000000000600082015250565b60006134e46019836129e1565b91506134ef826134ae565b602082019050919050565b60006020820190508181036000830152613513816134d7565b9050919050565b7f4f766572206d6178206d696e74207065722077616c6c65740000000000000000600082015250565b60006135506018836129e1565b915061355b8261351a565b602082019050919050565b6000602082019050818103600083015261357f81613543565b9050919050565b7f496e73756666696369656e742045544800000000000000000000000000000000600082015250565b60006135bc6010836129e1565b91506135c782613586565b602082019050919050565b600060208201905081810360008301526135eb816135af565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061362c82612a91565b915061363783612a91565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561366c5761366b6135f2565b5b828201905092915050565b7f4f766572206d617820737570706c790000000000000000000000000000000000600082015250565b60006136ad600f836129e1565b91506136b882613677565b602082019050919050565b600060208201905081810360008301526136dc816136a0565b9050919050565b7f4f766572206d61782072657365727665206d696e740000000000000000000000600082015250565b60006137196015836129e1565b9150613724826136e3565b602082019050919050565b600060208201905081810360008301526137488161370c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e6f7420616c6c6f77656420746f20617070726f76616c20746869732061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006137da6024836129e1565b91506137e58261377e565b604082019050919050565b60006020820190508181036000830152613809816137cd565b9050919050565b600081905092915050565b6000613826826129d6565b6138308185613810565b93506138408185602086016129f2565b80840191505092915050565b6000613858828561381b565b9150613864828461381b565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006138cc6026836129e1565b91506138d782613870565b604082019050919050565b600060208201905081810360008301526138fb816138bf565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613938601f836129e1565b915061394382613902565b602082019050919050565b600060208201905081810360008301526139678161392b565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006139a46010836129e1565b91506139af8261396e565b602082019050919050565b600060208201905081810360008301526139d381613997565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613a106020836129e1565b9150613a1b826139da565b602082019050919050565b60006020820190508181036000830152613a3f81613a03565b9050919050565b6000604082019050613a5b6000830185612b26565b613a686020830184612b26565b9392505050565b600081519050613a7e816130ed565b92915050565b600060208284031215613a9a57613a99612911565b5b6000613aa884828501613a6f565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000613ad882613ab1565b613ae28185613abc565b9350613af28185602086016129f2565b613afb81612a25565b840191505092915050565b6000608082019050613b1b6000830187612b26565b613b286020830186612b26565b613b356040830185612be9565b8181036060830152613b478184613acd565b905095945050505050565b600081519050613b6181612947565b92915050565b600060208284031215613b7d57613b7c612911565b5b6000613b8b84828501613b52565b91505092915050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000613bca6014836129e1565b9150613bd582613b94565b602082019050919050565b60006020820190508181036000830152613bf981613bbd565b905091905056fea264697066735822122080b73351f15b381e7405add4d3f201a430d1706bfcefa6ed0334628098ef94c664736f6c634300080d0033
Deployed Bytecode Sourcemap
75435:3545:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78631:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33465:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39956:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78064:248;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76207:320;;;:::i;:::-;;75627:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29216:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76535:150;;;;;;;;;;;;;:::i;:::-;;77318:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75580:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77201:109;;;;;;;;;;;;;:::i;:::-;;12154:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77550:232;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76693:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69786:528;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5545:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34858:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75535:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30400:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8410:103;;;;;;;;;;;;;:::i;:::-;;73662:900;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7762:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33641:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70702:2513;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78320:303;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77790:266;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69199:428;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33851:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77087:106;;;;;;;;;;;;;:::i;:::-;;76807:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40905;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8668:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76979:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78631:224;78780:4;78809:38;78835:11;78809:25;:38::i;:::-;78802:45;;78631:224;;;:::o;33465:100::-;33519:13;33552:5;33545:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33465:100;:::o;39956:218::-;40032:7;40057:16;40065:7;40057;:16::i;:::-;40052:64;;40082:34;;;;;;;;;;;;;;40052:64;40136:15;:24;40152:7;40136:24;;;;;;;;;;;:30;;;;;;;;;;;;40129:37;;39956:218;;;:::o;78064:248::-;78205:15;:19;78221:2;78205:19;;;;;;;;;;;;;;;;;;;;;;;;;78204:20;78196:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;78278:26;78292:2;78296:7;78278:13;:26::i;:::-;78064:248;;:::o;76207:320::-;2378:21;:19;:21::i;:::-;75768:9:::1;75754:23;;:10;:23;;;75746:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;5150:19:::2;:17;:19::i;:::-;76323:1:::3;76294:25;76308:10;76294:13;:25::i;:::-;:30;;76286:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;76385:9;;76372;:22;;76364:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;75617:3;76451:1;76434:14;:12;:14::i;:::-;:18;;;;:::i;:::-;:32;;76426:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;76499:20;76505:10;76517:1;76499:5;:20::i;:::-;2422::::0;:18;:20::i;:::-;76207:320::o;75627:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;29216:323::-;29277:7;29505:15;:13;:15::i;:::-;29490:12;;29474:13;;:28;:46;29467:53;;29216:323;:::o;76535:150::-;7648:13;:11;:13::i;:::-;76622:1:::1;76596:22;76610:7;:5;:7::i;:::-;76596:13;:22::i;:::-;:27;;76588:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;76660:17;76666:7;:5;:7::i;:::-;76675:1;76660:5;:17::i;:::-;76535:150::o:0;77318:224::-;77480:4;13503:10;13495:18;;:4;:18;;;13491:83;;13530:32;13551:10;13530:20;:32::i;:::-;13491:83;77497:37:::1;77516:4;77522:2;77526:7;77497:18;:37::i;:::-;77318:224:::0;;;;:::o;75580:40::-;75617:3;75580:40;:::o;77201:109::-;7648:13;:11;:13::i;:::-;77259:10:::1;77251:28;;:51;77280:21;77251:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;77201:109::o:0;12154:143::-;12254:42;12154:143;:::o;77550:232::-;77716:4;13503:10;13495:18;;:4;:18;;;13491:83;;13530:32;13551:10;13530:20;:32::i;:::-;13491:83;77733:41:::1;77756:4;77762:2;77766:7;77733:22;:41::i;:::-;77550:232:::0;;;;:::o;76693:106::-;7648:13;:11;:13::i;:::-;76784:7:::1;;76768:13;:23;;;;;;;:::i;:::-;;76693:106:::0;;:::o;69786:528::-;69930:23;69996:22;70021:8;;:15;;69996:40;;70051:34;70109:14;70088:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;70051:73;;70144:9;70139:125;70160:14;70155:1;:19;70139:125;;70216:32;70236:8;;70245:1;70236:11;;;;;;;:::i;:::-;;;;;;;;70216:19;:32::i;:::-;70200:10;70211:1;70200:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;70176:3;;;;;70139:125;;;;70285:10;70278:17;;;;69786:528;;;;:::o;5545:86::-;5592:4;5616:7;;;;;;;;;;;5609:14;;5545:86;:::o;34858:152::-;34930:7;34973:27;34992:7;34973:18;:27::i;:::-;34950:52;;34858:152;;;:::o;75535:38::-;;;;:::o;30400:233::-;30472:7;30513:1;30496:19;;:5;:19;;;30492:60;;30524:28;;;;;;;;;;;;;;30492:60;24559:13;30570:18;:25;30589:5;30570:25;;;;;;;;;;;;;;;;:55;30563:62;;30400:233;;;:::o;8410:103::-;7648:13;:11;:13::i;:::-;8475:30:::1;8502:1;8475:18;:30::i;:::-;8410:103::o:0;73662:900::-;73740:16;73794:19;73828:25;73868:22;73893:16;73903:5;73893:9;:16::i;:::-;73868:41;;73924:25;73966:14;73952:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73924:57;;73996:31;;:::i;:::-;74047:9;74059:15;:13;:15::i;:::-;74047:27;;74042:472;74091:14;74076:11;:29;74042:472;;74143:15;74156:1;74143:12;:15::i;:::-;74131:27;;74181:9;:16;;;74222:8;74177:73;74298:1;74272:28;;:9;:14;;;:28;;;74268:111;;74345:9;:14;;;74325:34;;74268:111;74422:5;74401:26;;:17;:26;;;74397:102;;74478:1;74452:8;74461:13;;;;;;74452:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;74397:102;74042:472;74107:3;;;;;74042:472;;;;74535:8;74528:15;;;;;;;73662:900;;;:::o;7762:87::-;7808:7;7835:6;;;;;;;;;;;7828:13;;7762:87;:::o;33641:104::-;33697:13;33730:7;33723:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33641:104;:::o;70702:2513::-;70845:16;70912:4;70903:5;:13;70899:45;;70925:19;;;;;;;;;;;;;;70899:45;70959:19;70993:17;71013:14;:12;:14::i;:::-;70993:34;;71113:15;:13;:15::i;:::-;71105:5;:23;71101:87;;;71157:15;:13;:15::i;:::-;71149:23;;71101:87;71264:9;71257:4;:16;71253:73;;;71301:9;71294:16;;71253:73;71340:25;71368:16;71378:5;71368:9;:16::i;:::-;71340:44;;71562:4;71554:5;:12;71550:278;;;71587:19;71616:5;71609:4;:12;71587:34;;71658:17;71644:11;:31;71640:111;;;71720:11;71700:31;;71640:111;71568:198;71550:278;;;71811:1;71791:21;;71550:278;71842:25;71884:17;71870:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71842:60;;71942:1;71921:17;:22;71917:78;;71971:8;71964:15;;;;;;;;71917:78;72139:31;72173:26;72193:5;72173:19;:26::i;:::-;72139:60;;72214:25;72459:9;:16;;;72454:92;;72516:9;:14;;;72496:34;;72454:92;72565:9;72577:5;72565:17;;72560:478;72589:4;72584:1;:9;;:45;;;;;72612:17;72597:11;:32;;72584:45;72560:478;;;72667:15;72680:1;72667:12;:15::i;:::-;72655:27;;72705:9;:16;;;72746:8;72701:73;72822:1;72796:28;;:9;:14;;;:28;;;72792:111;;72869:9;:14;;;72849:34;;72792:111;72946:5;72925:26;;:17;:26;;;72921:102;;73002:1;72976:8;72985:13;;;;;;72976:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;72921:102;72560:478;72631:3;;;;;72560:478;;;;73140:11;73130:8;73123:29;73188:8;73181:15;;;;;;;;70702:2513;;;;;;:::o;78320:303::-;78472:15;:25;78488:8;78472:25;;;;;;;;;;;;;;;;;;;;;;;;;78471:26;78449:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;78572:43;78596:8;78606;78572:23;:43::i;:::-;78320:303;;:::o;77790:266::-;77984:4;13503:10;13495:18;;:4;:18;;;13491:83;;13530:32;13551:10;13530:20;:32::i;:::-;13491:83;78001:47:::1;78024:4;78030:2;78034:7;78043:4;78001:22;:47::i;:::-;77790:266:::0;;;;;:::o;69199:428::-;69283:21;;:::i;:::-;69317:31;;:::i;:::-;69373:15;:13;:15::i;:::-;69363:7;:25;:54;;;;69403:14;:12;:14::i;:::-;69392:7;:25;;69363:54;69359:103;;;69441:9;69434:16;;;;;69359:103;69484:21;69497:7;69484:12;:21::i;:::-;69472:33;;69520:9;:16;;;69516:65;;;69560:9;69553:16;;;;;69516:65;69598:21;69611:7;69598:12;:21::i;:::-;69591:28;;;69199:428;;;;:::o;33851:318::-;33924:13;33955:16;33963:7;33955;:16::i;:::-;33950:59;;33980:29;;;;;;;;;;;;;;33950:59;34022:21;34046:10;:8;:10::i;:::-;34022:34;;34099:1;34080:7;34074:21;:26;:87;;;;;;;;;;;;;;;;;34127:7;34136:18;34146:7;34136:9;:18::i;:::-;34110:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;34074:87;34067:94;;;33851:318;;;:::o;77087:106::-;7648:13;:11;:13::i;:::-;77141:8:::1;:6;:8::i;:::-;77137:48;;;77151:10;:8;:10::i;:::-;77137:48;;;77177:8;:6;:8::i;:::-;77137:48;77087:106::o:0;76807:164::-;7648:13;:11;:13::i;:::-;76952:11:::1;76924:15;:25;76940:8;76924:25;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;76807:164:::0;;:::o;40905:::-;41002:4;41026:18;:25;41045:5;41026:25;;;;;;;;;;;;;;;:35;41052:8;41026:35;;;;;;;;;;;;;;;;;;;;;;;;;41019:42;;40905:164;;;;:::o;8668:201::-;7648:13;:11;:13::i;:::-;8777:1:::1;8757:22;;:8;:22;;::::0;8749:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;8833:28;8852:8;8833:18;:28::i;:::-;8668:201:::0;:::o;76979:100::-;7648:13;:11;:13::i;:::-;77062:9:::1;77050;:21;;;;76979:100:::0;:::o;32563:639::-;32648:4;32987:10;32972:25;;:11;:25;;;;:102;;;;33064:10;33049:25;;:11;:25;;;;32972:102;:179;;;;33141:10;33126:25;;:11;:25;;;;32972:179;32952:199;;32563:639;;;:::o;41327:282::-;41392:4;41448:7;41429:15;:13;:15::i;:::-;:26;;:66;;;;;41482:13;;41472:7;:23;41429:66;:153;;;;;41581:1;25335:8;41533:17;:26;41551:7;41533:26;;;;;;;;;;;;:44;:49;41429:153;41409:173;;41327:282;;;:::o;39389:408::-;39478:13;39494:16;39502:7;39494;:16::i;:::-;39478:32;;39550:5;39527:28;;:19;:17;:19::i;:::-;:28;;;39523:175;;39575:44;39592:5;39599:19;:17;:19::i;:::-;39575:16;:44::i;:::-;39570:128;;39647:35;;;;;;;;;;;;;;39570:128;39523:175;39743:2;39710:15;:24;39726:7;39710:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;39781:7;39777:2;39761:28;;39770:5;39761:28;;;;;;;;;;;;39467:330;39389:408;;:::o;2458:293::-;1860:1;2592:7;;:19;2584:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1860:1;2725:7;:18;;;;2458:293::o;5704:108::-;5775:8;:6;:8::i;:::-;5774:9;5766:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;5704:108::o;30715:178::-;30776:7;24559:13;24697:2;30804:18;:25;30823:5;30804:25;;;;;;;;;;;;;;;;:50;;30803:82;30796:89;;30715:178;;;:::o;29637:296::-;29692:7;29899:15;:13;:15::i;:::-;29883:13;;:31;29876:38;;29637:296;:::o;50976:2966::-;51049:20;51072:13;;51049:36;;51112:1;51100:8;:13;51096:44;;51122:18;;;;;;;;;;;;;;51096:44;51153:61;51183:1;51187:2;51191:12;51205:8;51153:21;:61::i;:::-;51697:1;24697:2;51667:1;:26;;51666:32;51654:8;:45;51628:18;:22;51647:2;51628:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;51976:139;52013:2;52067:33;52090:1;52094:2;52098:1;52067:14;:33::i;:::-;52034:30;52055:8;52034:20;:30::i;:::-;:66;51976:18;:139::i;:::-;51942:17;:31;51960:12;51942:31;;;;;;;;;;;:173;;;;52132:16;52163:11;52192:8;52177:12;:23;52163:37;;52713:16;52709:2;52705:25;52693:37;;53085:12;53045:8;53004:1;52942:25;52883:1;52822;52795:335;53456:1;53442:12;53438:20;53396:346;53497:3;53488:7;53485:16;53396:346;;53715:7;53705:8;53702:1;53675:25;53672:1;53669;53664:59;53550:1;53541:7;53537:15;53526:26;;53396:346;;;53400:77;53787:1;53775:8;:13;53771:45;;53797:19;;;;;;;;;;;;;;53771:45;53849:3;53833:13;:19;;;;51402:2462;;53874:60;53903:1;53907:2;53911:12;53925:8;53874:20;:60::i;:::-;51038:2904;50976:2966;;:::o;2759:213::-;1816:1;2942:7;:22;;;;2759:213::o;28732:92::-;28788:7;28732:92;:::o;7927:132::-;8002:12;:10;:12::i;:::-;7991:23;;:7;:5;:7::i;:::-;:23;;;7983:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7927:132::o;13733:419::-;13972:1;12254:42;13924:45;;;:49;13920:225;;;12254:42;13995;;;14046:4;14053:8;13995:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13990:144;;14109:8;14090:28;;;;;;;;;;;:::i;:::-;;;;;;;;13990:144;13920:225;13733:419;:::o;43595:2825::-;43737:27;43767;43786:7;43767:18;:27::i;:::-;43737:57;;43852:4;43811:45;;43827:19;43811:45;;;43807:86;;43865:28;;;;;;;;;;;;;;43807:86;43907:27;43936:23;43963:35;43990:7;43963:26;:35::i;:::-;43906:92;;;;44098:68;44123:15;44140:4;44146:19;:17;:19::i;:::-;44098:24;:68::i;:::-;44093:180;;44186:43;44203:4;44209:19;:17;:19::i;:::-;44186:16;:43::i;:::-;44181:92;;44238:35;;;;;;;;;;;;;;44181:92;44093:180;44304:1;44290:16;;:2;:16;;;44286:52;;44315:23;;;;;;;;;;;;;;44286:52;44351:43;44373:4;44379:2;44383:7;44392:1;44351:21;:43::i;:::-;44487:15;44484:160;;;44627:1;44606:19;44599:30;44484:160;45024:18;:24;45043:4;45024:24;;;;;;;;;;;;;;;;45022:26;;;;;;;;;;;;45093:18;:22;45112:2;45093:22;;;;;;;;;;;;;;;;45091:24;;;;;;;;;;;45415:146;45452:2;45501:45;45516:4;45522:2;45526:19;45501:14;:45::i;:::-;25615:8;45473:73;45415:18;:146::i;:::-;45386:17;:26;45404:7;45386:26;;;;;;;;;;;:175;;;;45732:1;25615:8;45681:19;:47;:52;45677:627;;45754:19;45786:1;45776:7;:11;45754:33;;45943:1;45909:17;:30;45927:11;45909:30;;;;;;;;;;;;:35;45905:384;;46047:13;;46032:11;:28;46028:242;;46227:19;46194:17;:30;46212:11;46194:30;;;;;;;;;;;:52;;;;46028:242;45905:384;45735:569;45677:627;46351:7;46347:2;46332:27;;46341:4;46332:27;;;;;;;;;;;;46370:42;46391:4;46397:2;46401:7;46410:1;46370:20;:42::i;:::-;43726:2694;;;43595:2825;;;:::o;46516:193::-;46662:39;46679:4;46685:2;46689:7;46662:39;;;;;;;;;;;;:16;:39::i;:::-;46516:193;;;:::o;36013:1275::-;36080:7;36100:12;36115:7;36100:22;;36183:4;36164:15;:13;:15::i;:::-;:23;36160:1061;;36217:13;;36210:4;:20;36206:1015;;;36255:14;36272:17;:23;36290:4;36272:23;;;;;;;;;;;;36255:40;;36389:1;25335:8;36361:6;:24;:29;36357:845;;37026:113;37043:1;37033:6;:11;37026:113;;37086:17;:25;37104:6;;;;;;;37086:25;;;;;;;;;;;;37077:34;;37026:113;;;37172:6;37165:13;;;;;;36357:845;36232:989;36206:1015;36160:1061;37249:31;;;;;;;;;;;;;;36013:1275;;;;:::o;9029:191::-;9103:16;9122:6;;;;;;;;;;;9103:25;;9148:8;9139:6;;:17;;;;;;;;;;;;;;;;;;9203:8;9172:40;;9193:8;9172:40;;;;;;;;;;;;9092:128;9029:191;:::o;35461:161::-;35529:21;;:::i;:::-;35570:44;35589:17;:24;35607:5;35589:24;;;;;;;;;;;;35570:18;:44::i;:::-;35563:51;;35461:161;;;:::o;28903:103::-;28958:7;28985:13;;28978:20;;28903:103;:::o;40514:234::-;40661:8;40609:18;:39;40628:19;:17;:19::i;:::-;40609:39;;;;;;;;;;;;;;;:49;40649:8;40609:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;40721:8;40685:55;;40700:19;:17;:19::i;:::-;40685:55;;;40731:8;40685:55;;;;;;:::i;:::-;;;;;;;;40514:234;;:::o;47307:407::-;47482:31;47495:4;47501:2;47505:7;47482:12;:31::i;:::-;47546:1;47528:2;:14;;;:19;47524:183;;47567:56;47598:4;47604:2;47608:7;47617:5;47567:30;:56::i;:::-;47562:145;;47651:40;;;;;;;;;;;;;;47562:145;47524:183;47307:407;;;;:::o;35199:166::-;35269:21;;:::i;:::-;35310:47;35329:27;35348:7;35329:18;:27::i;:::-;35310:18;:47::i;:::-;35303:54;;35199:166;;;:::o;78863:114::-;78923:13;78956;78949:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78863:114;:::o;63842:1745::-;63907:17;64341:4;64334;64328:11;64324:22;64433:1;64427:4;64420:15;64508:4;64505:1;64501:12;64494:19;;64590:1;64585:3;64578:14;64694:3;64933:5;64915:428;64941:1;64915:428;;;64981:1;64976:3;64972:11;64965:18;;65152:2;65146:4;65142:13;65138:2;65134:22;65129:3;65121:36;65246:2;65240:4;65236:13;65228:21;;65313:4;64915:428;65303:25;64915:428;64919:21;65382:3;65377;65373:13;65497:4;65492:3;65488:14;65481:21;;65562:6;65557:3;65550:19;63946:1634;;;63842:1745;;;:::o;6400:120::-;5409:16;:14;:16::i;:::-;6469:5:::1;6459:7;;:15;;;;;;;;;;;;;;;;;;6490:22;6499:12;:10;:12::i;:::-;6490:22;;;;;;:::i;:::-;;;;;;;;6400:120::o:0;6141:118::-;5150:19;:17;:19::i;:::-;6211:4:::1;6201:7;;:14;;;;;;;;;;;;;;;;;;6231:20;6238:12;:10;:12::i;:::-;6231:20;;;;;;:::i;:::-;;;;;;;;6141:118::o:0;63635:105::-;63695:7;63722:10;63715:17;;63635:105;:::o;48376:159::-;;;;;:::o;62944:311::-;63079:7;63099:16;25739:3;63125:19;:41;;63099:68;;25739:3;63193:31;63204:4;63210:2;63214:9;63193:10;:31::i;:::-;63185:40;;:62;;63178:69;;;62944:311;;;;;:::o;38388:324::-;38458:14;38691:1;38681:8;38678:15;38652:24;38648:46;38638:56;;38388:324;;;:::o;37836:450::-;37916:14;38084:16;38077:5;38073:28;38064:37;;38261:5;38247:11;38222:23;38218:41;38215:52;38208:5;38205:63;38195:73;;37836:450;;;;:::o;49200:158::-;;;;;:::o;3658:98::-;3711:7;3738:10;3731:17;;3658:98;:::o;42490:485::-;42592:27;42621:23;42662:38;42703:15;:24;42719:7;42703:24;;;;;;;;;;;42662:65;;42880:18;42857:41;;42937:19;42931:26;42912:45;;42842:126;42490:485;;;:::o;41718:659::-;41867:11;42032:16;42025:5;42021:28;42012:37;;42192:16;42181:9;42177:32;42164:45;;42342:15;42331:9;42328:30;42320:5;42309:9;42306:20;42303:56;42293:66;;41718:659;;;;;:::o;37387:366::-;37453:31;;:::i;:::-;37530:6;37497:9;:14;;:41;;;;;;;;;;;25218:3;37583:6;:33;;37549:9;:24;;:68;;;;;;;;;;;37675:1;25335:8;37647:6;:24;:29;;37628:9;:16;;:48;;;;;;;;;;;25739:3;37716:6;:28;;37687:9;:19;;:58;;;;;;;;;;;37387:366;;;:::o;49798:716::-;49961:4;50007:2;49982:45;;;50028:19;:17;:19::i;:::-;50049:4;50055:7;50064:5;49982:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;49978:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50282:1;50265:6;:13;:18;50261:235;;50311:40;;;;;;;;;;;;;;50261:235;50454:6;50448:13;50439:6;50435:2;50431:15;50424:38;49978:529;50151:54;;;50141:64;;;:6;:64;;;;50134:71;;;49798:716;;;;;;:::o;5889:108::-;5956:8;:6;:8::i;:::-;5948:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;5889:108::o;62645:147::-;62782:6;62645:147;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:329::-;4997:6;5046:2;5034:9;5025:7;5021:23;5017:32;5014:119;;;5052:79;;:::i;:::-;5014:119;5172:1;5197:53;5242:7;5233:6;5222:9;5218:22;5197:53;:::i;:::-;5187:63;;5143:117;4938:329;;;;:::o;5273:118::-;5360:24;5378:5;5360:24;:::i;:::-;5355:3;5348:37;5273:118;;:::o;5397:222::-;5490:4;5528:2;5517:9;5513:18;5505:26;;5541:71;5609:1;5598:9;5594:17;5585:6;5541:71;:::i;:::-;5397:222;;;;:::o;5625:619::-;5702:6;5710;5718;5767:2;5755:9;5746:7;5742:23;5738:32;5735:119;;;5773:79;;:::i;:::-;5735:119;5893:1;5918:53;5963:7;5954:6;5943:9;5939:22;5918:53;:::i;:::-;5908:63;;5864:117;6020:2;6046:53;6091:7;6082:6;6071:9;6067:22;6046:53;:::i;:::-;6036:63;;5991:118;6148:2;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6119:118;5625:619;;;;;:::o;6250:60::-;6278:3;6299:5;6292:12;;6250:60;;;:::o;6316:142::-;6366:9;6399:53;6417:34;6426:24;6444:5;6426:24;:::i;:::-;6417:34;:::i;:::-;6399:53;:::i;:::-;6386:66;;6316:142;;;:::o;6464:126::-;6514:9;6547:37;6578:5;6547:37;:::i;:::-;6534:50;;6464:126;;;:::o;6596:157::-;6677:9;6710:37;6741:5;6710:37;:::i;:::-;6697:50;;6596:157;;;:::o;6759:193::-;6877:68;6939:5;6877:68;:::i;:::-;6872:3;6865:81;6759:193;;:::o;6958:284::-;7082:4;7120:2;7109:9;7105:18;7097:26;;7133:102;7232:1;7221:9;7217:17;7208:6;7133:102;:::i;:::-;6958:284;;;;:::o;7248:117::-;7357:1;7354;7347:12;7371:117;7480:1;7477;7470:12;7494:117;7603:1;7600;7593:12;7631:553;7689:8;7699:6;7749:3;7742:4;7734:6;7730:17;7726:27;7716:122;;7757:79;;:::i;:::-;7716:122;7870:6;7857:20;7847:30;;7900:18;7892:6;7889:30;7886:117;;;7922:79;;:::i;:::-;7886:117;8036:4;8028:6;8024:17;8012:29;;8090:3;8082:4;8074:6;8070:17;8060:8;8056:32;8053:41;8050:128;;;8097:79;;:::i;:::-;8050:128;7631:553;;;;;:::o;8190:529::-;8261:6;8269;8318:2;8306:9;8297:7;8293:23;8289:32;8286:119;;;8324:79;;:::i;:::-;8286:119;8472:1;8461:9;8457:17;8444:31;8502:18;8494:6;8491:30;8488:117;;;8524:79;;:::i;:::-;8488:117;8637:65;8694:7;8685:6;8674:9;8670:22;8637:65;:::i;:::-;8619:83;;;;8415:297;8190:529;;;;;:::o;8742:568::-;8815:8;8825:6;8875:3;8868:4;8860:6;8856:17;8852:27;8842:122;;8883:79;;:::i;:::-;8842:122;8996:6;8983:20;8973:30;;9026:18;9018:6;9015:30;9012:117;;;9048:79;;:::i;:::-;9012:117;9162:4;9154:6;9150:17;9138:29;;9216:3;9208:4;9200:6;9196:17;9186:8;9182:32;9179:41;9176:128;;;9223:79;;:::i;:::-;9176:128;8742:568;;;;;:::o;9316:559::-;9402:6;9410;9459:2;9447:9;9438:7;9434:23;9430:32;9427:119;;;9465:79;;:::i;:::-;9427:119;9613:1;9602:9;9598:17;9585:31;9643:18;9635:6;9632:30;9629:117;;;9665:79;;:::i;:::-;9629:117;9778:80;9850:7;9841:6;9830:9;9826:22;9778:80;:::i;:::-;9760:98;;;;9556:312;9316:559;;;;;:::o;9881:145::-;9979:6;10013:5;10007:12;9997:22;;9881:145;;;:::o;10032:215::-;10162:11;10196:6;10191:3;10184:19;10236:4;10231:3;10227:14;10212:29;;10032:215;;;;:::o;10253:163::-;10351:4;10374:3;10366:11;;10404:4;10399:3;10395:14;10387:22;;10253:163;;;:::o;10422:108::-;10499:24;10517:5;10499:24;:::i;:::-;10494:3;10487:37;10422:108;;:::o;10536:101::-;10572:7;10612:18;10605:5;10601:30;10590:41;;10536:101;;;:::o;10643:105::-;10718:23;10735:5;10718:23;:::i;:::-;10713:3;10706:36;10643:105;;:::o;10754:99::-;10825:21;10840:5;10825:21;:::i;:::-;10820:3;10813:34;10754:99;;:::o;10859:91::-;10895:7;10935:8;10928:5;10924:20;10913:31;;10859:91;;;:::o;10956:105::-;11031:23;11048:5;11031:23;:::i;:::-;11026:3;11019:36;10956:105;;:::o;11139:864::-;11288:4;11283:3;11279:14;11375:4;11368:5;11364:16;11358:23;11394:63;11451:4;11446:3;11442:14;11428:12;11394:63;:::i;:::-;11303:164;11559:4;11552:5;11548:16;11542:23;11578:61;11633:4;11628:3;11624:14;11610:12;11578:61;:::i;:::-;11477:172;11733:4;11726:5;11722:16;11716:23;11752:57;11803:4;11798:3;11794:14;11780:12;11752:57;:::i;:::-;11659:160;11906:4;11899:5;11895:16;11889:23;11925:61;11980:4;11975:3;11971:14;11957:12;11925:61;:::i;:::-;11829:167;11257:746;11139:864;;:::o;12009:303::-;12140:10;12161:108;12265:3;12257:6;12161:108;:::i;:::-;12301:4;12296:3;12292:14;12278:28;;12009:303;;;;:::o;12318:144::-;12419:4;12451;12446:3;12442:14;12434:22;;12318:144;;;:::o;12544:980::-;12725:3;12754:85;12833:5;12754:85;:::i;:::-;12855:117;12965:6;12960:3;12855:117;:::i;:::-;12848:124;;12996:87;13077:5;12996:87;:::i;:::-;13106:7;13137:1;13122:377;13147:6;13144:1;13141:13;13122:377;;;13223:6;13217:13;13250:125;13371:3;13356:13;13250:125;:::i;:::-;13243:132;;13398:91;13482:6;13398:91;:::i;:::-;13388:101;;13182:317;13169:1;13166;13162:9;13157:14;;13122:377;;;13126:14;13515:3;13508:10;;12730:794;;;12544:980;;;;:::o;13530:497::-;13735:4;13773:2;13762:9;13758:18;13750:26;;13822:9;13816:4;13812:20;13808:1;13797:9;13793:17;13786:47;13850:170;14015:4;14006:6;13850:170;:::i;:::-;13842:178;;13530:497;;;;:::o;14033:114::-;14100:6;14134:5;14128:12;14118:22;;14033:114;;;:::o;14153:184::-;14252:11;14286:6;14281:3;14274:19;14326:4;14321:3;14317:14;14302:29;;14153:184;;;;:::o;14343:132::-;14410:4;14433:3;14425:11;;14463:4;14458:3;14454:14;14446:22;;14343:132;;;:::o;14481:108::-;14558:24;14576:5;14558:24;:::i;:::-;14553:3;14546:37;14481:108;;:::o;14595:179::-;14664:10;14685:46;14727:3;14719:6;14685:46;:::i;:::-;14763:4;14758:3;14754:14;14740:28;;14595:179;;;;:::o;14780:113::-;14850:4;14882;14877:3;14873:14;14865:22;;14780:113;;;:::o;14929:732::-;15048:3;15077:54;15125:5;15077:54;:::i;:::-;15147:86;15226:6;15221:3;15147:86;:::i;:::-;15140:93;;15257:56;15307:5;15257:56;:::i;:::-;15336:7;15367:1;15352:284;15377:6;15374:1;15371:13;15352:284;;;15453:6;15447:13;15480:63;15539:3;15524:13;15480:63;:::i;:::-;15473:70;;15566:60;15619:6;15566:60;:::i;:::-;15556:70;;15412:224;15399:1;15396;15392:9;15387:14;;15352:284;;;15356:14;15652:3;15645:10;;15053:608;;;14929:732;;;;:::o;15667:373::-;15810:4;15848:2;15837:9;15833:18;15825:26;;15897:9;15891:4;15887:20;15883:1;15872:9;15868:17;15861:47;15925:108;16028:4;16019:6;15925:108;:::i;:::-;15917:116;;15667:373;;;;:::o;16046:619::-;16123:6;16131;16139;16188:2;16176:9;16167:7;16163:23;16159:32;16156:119;;;16194:79;;:::i;:::-;16156:119;16314:1;16339:53;16384:7;16375:6;16364:9;16360:22;16339:53;:::i;:::-;16329:63;;16285:117;16441:2;16467:53;16512:7;16503:6;16492:9;16488:22;16467:53;:::i;:::-;16457:63;;16412:118;16569:2;16595:53;16640:7;16631:6;16620:9;16616:22;16595:53;:::i;:::-;16585:63;;16540:118;16046:619;;;;;:::o;16671:116::-;16741:21;16756:5;16741:21;:::i;:::-;16734:5;16731:32;16721:60;;16777:1;16774;16767:12;16721:60;16671:116;:::o;16793:133::-;16836:5;16874:6;16861:20;16852:29;;16890:30;16914:5;16890:30;:::i;:::-;16793:133;;;;:::o;16932:468::-;16997:6;17005;17054:2;17042:9;17033:7;17029:23;17025:32;17022:119;;;17060:79;;:::i;:::-;17022:119;17180:1;17205:53;17250:7;17241:6;17230:9;17226:22;17205:53;:::i;:::-;17195:63;;17151:117;17307:2;17333:50;17375:7;17366:6;17355:9;17351:22;17333:50;:::i;:::-;17323:60;;17278:115;16932:468;;;;;:::o;17406:117::-;17515:1;17512;17505:12;17529:180;17577:77;17574:1;17567:88;17674:4;17671:1;17664:15;17698:4;17695:1;17688:15;17715:281;17798:27;17820:4;17798:27;:::i;:::-;17790:6;17786:40;17928:6;17916:10;17913:22;17892:18;17880:10;17877:34;17874:62;17871:88;;;17939:18;;:::i;:::-;17871:88;17979:10;17975:2;17968:22;17758:238;17715:281;;:::o;18002:129::-;18036:6;18063:20;;:::i;:::-;18053:30;;18092:33;18120:4;18112:6;18092:33;:::i;:::-;18002:129;;;:::o;18137:307::-;18198:4;18288:18;18280:6;18277:30;18274:56;;;18310:18;;:::i;:::-;18274:56;18348:29;18370:6;18348:29;:::i;:::-;18340:37;;18432:4;18426;18422:15;18414:23;;18137:307;;;:::o;18450:154::-;18534:6;18529:3;18524;18511:30;18596:1;18587:6;18582:3;18578:16;18571:27;18450:154;;;:::o;18610:410::-;18687:5;18712:65;18728:48;18769:6;18728:48;:::i;:::-;18712:65;:::i;:::-;18703:74;;18800:6;18793:5;18786:21;18838:4;18831:5;18827:16;18876:3;18867:6;18862:3;18858:16;18855:25;18852:112;;;18883:79;;:::i;:::-;18852:112;18973:41;19007:6;19002:3;18997;18973:41;:::i;:::-;18693:327;18610:410;;;;;:::o;19039:338::-;19094:5;19143:3;19136:4;19128:6;19124:17;19120:27;19110:122;;19151:79;;:::i;:::-;19110:122;19268:6;19255:20;19293:78;19367:3;19359:6;19352:4;19344:6;19340:17;19293:78;:::i;:::-;19284:87;;19100:277;19039:338;;;;:::o;19383:943::-;19478:6;19486;19494;19502;19551:3;19539:9;19530:7;19526:23;19522:33;19519:120;;;19558:79;;:::i;:::-;19519:120;19678:1;19703:53;19748:7;19739:6;19728:9;19724:22;19703:53;:::i;:::-;19693:63;;19649:117;19805:2;19831:53;19876:7;19867:6;19856:9;19852:22;19831:53;:::i;:::-;19821:63;;19776:118;19933:2;19959:53;20004:7;19995:6;19984:9;19980:22;19959:53;:::i;:::-;19949:63;;19904:118;20089:2;20078:9;20074:18;20061:32;20120:18;20112:6;20109:30;20106:117;;;20142:79;;:::i;:::-;20106:117;20247:62;20301:7;20292:6;20281:9;20277:22;20247:62;:::i;:::-;20237:72;;20032:287;19383:943;;;;;;;:::o;20404:874::-;20563:4;20558:3;20554:14;20650:4;20643:5;20639:16;20633:23;20669:63;20726:4;20721:3;20717:14;20703:12;20669:63;:::i;:::-;20578:164;20834:4;20827:5;20823:16;20817:23;20853:61;20908:4;20903:3;20899:14;20885:12;20853:61;:::i;:::-;20752:172;21008:4;21001:5;20997:16;20991:23;21027:57;21078:4;21073:3;21069:14;21055:12;21027:57;:::i;:::-;20934:160;21181:4;21174:5;21170:16;21164:23;21200:61;21255:4;21250:3;21246:14;21232:12;21200:61;:::i;:::-;21104:167;20532:746;20404:874;;:::o;21284:347::-;21439:4;21477:3;21466:9;21462:19;21454:27;;21491:133;21621:1;21610:9;21606:17;21597:6;21491:133;:::i;:::-;21284:347;;;;:::o;21637:474::-;21705:6;21713;21762:2;21750:9;21741:7;21737:23;21733:32;21730:119;;;21768:79;;:::i;:::-;21730:119;21888:1;21913:53;21958:7;21949:6;21938:9;21934:22;21913:53;:::i;:::-;21903:63;;21859:117;22015:2;22041:53;22086:7;22077:6;22066:9;22062:22;22041:53;:::i;:::-;22031:63;;21986:118;21637:474;;;;;:::o;22117:180::-;22165:77;22162:1;22155:88;22262:4;22259:1;22252:15;22286:4;22283:1;22276:15;22303:320;22347:6;22384:1;22378:4;22374:12;22364:22;;22431:1;22425:4;22421:12;22452:18;22442:81;;22508:4;22500:6;22496:17;22486:27;;22442:81;22570:2;22562:6;22559:14;22539:18;22536:38;22533:84;;22589:18;;:::i;:::-;22533:84;22354:269;22303:320;;;:::o;22629:225::-;22769:34;22765:1;22757:6;22753:14;22746:58;22838:8;22833:2;22825:6;22821:15;22814:33;22629:225;:::o;22860:366::-;23002:3;23023:67;23087:2;23082:3;23023:67;:::i;:::-;23016:74;;23099:93;23188:3;23099:93;:::i;:::-;23217:2;23212:3;23208:12;23201:19;;22860:366;;;:::o;23232:419::-;23398:4;23436:2;23425:9;23421:18;23413:26;;23485:9;23479:4;23475:20;23471:1;23460:9;23456:17;23449:47;23513:131;23639:4;23513:131;:::i;:::-;23505:139;;23232:419;;;:::o;23657:175::-;23797:27;23793:1;23785:6;23781:14;23774:51;23657:175;:::o;23838:366::-;23980:3;24001:67;24065:2;24060:3;24001:67;:::i;:::-;23994:74;;24077:93;24166:3;24077:93;:::i;:::-;24195:2;24190:3;24186:12;24179:19;;23838:366;;;:::o;24210:419::-;24376:4;24414:2;24403:9;24399:18;24391:26;;24463:9;24457:4;24453:20;24449:1;24438:9;24434:17;24427:47;24491:131;24617:4;24491:131;:::i;:::-;24483:139;;24210:419;;;:::o;24635:174::-;24775:26;24771:1;24763:6;24759:14;24752:50;24635:174;:::o;24815:366::-;24957:3;24978:67;25042:2;25037:3;24978:67;:::i;:::-;24971:74;;25054:93;25143:3;25054:93;:::i;:::-;25172:2;25167:3;25163:12;25156:19;;24815:366;;;:::o;25187:419::-;25353:4;25391:2;25380:9;25376:18;25368:26;;25440:9;25434:4;25430:20;25426:1;25415:9;25411:17;25404:47;25468:131;25594:4;25468:131;:::i;:::-;25460:139;;25187:419;;;:::o;25612:166::-;25752:18;25748:1;25740:6;25736:14;25729:42;25612:166;:::o;25784:366::-;25926:3;25947:67;26011:2;26006:3;25947:67;:::i;:::-;25940:74;;26023:93;26112:3;26023:93;:::i;:::-;26141:2;26136:3;26132:12;26125:19;;25784:366;;;:::o;26156:419::-;26322:4;26360:2;26349:9;26345:18;26337:26;;26409:9;26403:4;26399:20;26395:1;26384:9;26380:17;26373:47;26437:131;26563:4;26437:131;:::i;:::-;26429:139;;26156:419;;;:::o;26581:180::-;26629:77;26626:1;26619:88;26726:4;26723:1;26716:15;26750:4;26747:1;26740:15;26767:305;26807:3;26826:20;26844:1;26826:20;:::i;:::-;26821:25;;26860:20;26878:1;26860:20;:::i;:::-;26855:25;;27014:1;26946:66;26942:74;26939:1;26936:81;26933:107;;;27020:18;;:::i;:::-;26933:107;27064:1;27061;27057:9;27050:16;;26767:305;;;;:::o;27078:165::-;27218:17;27214:1;27206:6;27202:14;27195:41;27078:165;:::o;27249:366::-;27391:3;27412:67;27476:2;27471:3;27412:67;:::i;:::-;27405:74;;27488:93;27577:3;27488:93;:::i;:::-;27606:2;27601:3;27597:12;27590:19;;27249:366;;;:::o;27621:419::-;27787:4;27825:2;27814:9;27810:18;27802:26;;27874:9;27868:4;27864:20;27860:1;27849:9;27845:17;27838:47;27902:131;28028:4;27902:131;:::i;:::-;27894:139;;27621:419;;;:::o;28046:171::-;28186:23;28182:1;28174:6;28170:14;28163:47;28046:171;:::o;28223:366::-;28365:3;28386:67;28450:2;28445:3;28386:67;:::i;:::-;28379:74;;28462:93;28551:3;28462:93;:::i;:::-;28580:2;28575:3;28571:12;28564:19;;28223:366;;;:::o;28595:419::-;28761:4;28799:2;28788:9;28784:18;28776:26;;28848:9;28842:4;28838:20;28834:1;28823:9;28819:17;28812:47;28876:131;29002:4;28876:131;:::i;:::-;28868:139;;28595:419;;;:::o;29020:180::-;29068:77;29065:1;29058:88;29165:4;29162:1;29155:15;29189:4;29186:1;29179:15;29206:223;29346:34;29342:1;29334:6;29330:14;29323:58;29415:6;29410:2;29402:6;29398:15;29391:31;29206:223;:::o;29435:366::-;29577:3;29598:67;29662:2;29657:3;29598:67;:::i;:::-;29591:74;;29674:93;29763:3;29674:93;:::i;:::-;29792:2;29787:3;29783:12;29776:19;;29435:366;;;:::o;29807:419::-;29973:4;30011:2;30000:9;29996:18;29988:26;;30060:9;30054:4;30050:20;30046:1;30035:9;30031:17;30024:47;30088:131;30214:4;30088:131;:::i;:::-;30080:139;;29807:419;;;:::o;30232:148::-;30334:11;30371:3;30356:18;;30232:148;;;;:::o;30386:377::-;30492:3;30520:39;30553:5;30520:39;:::i;:::-;30575:89;30657:6;30652:3;30575:89;:::i;:::-;30568:96;;30673:52;30718:6;30713:3;30706:4;30699:5;30695:16;30673:52;:::i;:::-;30750:6;30745:3;30741:16;30734:23;;30496:267;30386:377;;;;:::o;30769:435::-;30949:3;30971:95;31062:3;31053:6;30971:95;:::i;:::-;30964:102;;31083:95;31174:3;31165:6;31083:95;:::i;:::-;31076:102;;31195:3;31188:10;;30769:435;;;;;:::o;31210:225::-;31350:34;31346:1;31338:6;31334:14;31327:58;31419:8;31414:2;31406:6;31402:15;31395:33;31210:225;:::o;31441:366::-;31583:3;31604:67;31668:2;31663:3;31604:67;:::i;:::-;31597:74;;31680:93;31769:3;31680:93;:::i;:::-;31798:2;31793:3;31789:12;31782:19;;31441:366;;;:::o;31813:419::-;31979:4;32017:2;32006:9;32002:18;31994:26;;32066:9;32060:4;32056:20;32052:1;32041:9;32037:17;32030:47;32094:131;32220:4;32094:131;:::i;:::-;32086:139;;31813:419;;;:::o;32238:181::-;32378:33;32374:1;32366:6;32362:14;32355:57;32238:181;:::o;32425:366::-;32567:3;32588:67;32652:2;32647:3;32588:67;:::i;:::-;32581:74;;32664:93;32753:3;32664:93;:::i;:::-;32782:2;32777:3;32773:12;32766:19;;32425:366;;;:::o;32797:419::-;32963:4;33001:2;32990:9;32986:18;32978:26;;33050:9;33044:4;33040:20;33036:1;33025:9;33021:17;33014:47;33078:131;33204:4;33078:131;:::i;:::-;33070:139;;32797:419;;;:::o;33222:166::-;33362:18;33358:1;33350:6;33346:14;33339:42;33222:166;:::o;33394:366::-;33536:3;33557:67;33621:2;33616:3;33557:67;:::i;:::-;33550:74;;33633:93;33722:3;33633:93;:::i;:::-;33751:2;33746:3;33742:12;33735:19;;33394:366;;;:::o;33766:419::-;33932:4;33970:2;33959:9;33955:18;33947:26;;34019:9;34013:4;34009:20;34005:1;33994:9;33990:17;33983:47;34047:131;34173:4;34047:131;:::i;:::-;34039:139;;33766:419;;;:::o;34191:182::-;34331:34;34327:1;34319:6;34315:14;34308:58;34191:182;:::o;34379:366::-;34521:3;34542:67;34606:2;34601:3;34542:67;:::i;:::-;34535:74;;34618:93;34707:3;34618:93;:::i;:::-;34736:2;34731:3;34727:12;34720:19;;34379:366;;;:::o;34751:419::-;34917:4;34955:2;34944:9;34940:18;34932:26;;35004:9;34998:4;34994:20;34990:1;34979:9;34975:17;34968:47;35032:131;35158:4;35032:131;:::i;:::-;35024:139;;34751:419;;;:::o;35176:332::-;35297:4;35335:2;35324:9;35320:18;35312:26;;35348:71;35416:1;35405:9;35401:17;35392:6;35348:71;:::i;:::-;35429:72;35497:2;35486:9;35482:18;35473:6;35429:72;:::i;:::-;35176:332;;;;;:::o;35514:137::-;35568:5;35599:6;35593:13;35584:22;;35615:30;35639:5;35615:30;:::i;:::-;35514:137;;;;:::o;35657:345::-;35724:6;35773:2;35761:9;35752:7;35748:23;35744:32;35741:119;;;35779:79;;:::i;:::-;35741:119;35899:1;35924:61;35977:7;35968:6;35957:9;35953:22;35924:61;:::i;:::-;35914:71;;35870:125;35657:345;;;;:::o;36008:98::-;36059:6;36093:5;36087:12;36077:22;;36008:98;;;:::o;36112:168::-;36195:11;36229:6;36224:3;36217:19;36269:4;36264:3;36260:14;36245:29;;36112:168;;;;:::o;36286:360::-;36372:3;36400:38;36432:5;36400:38;:::i;:::-;36454:70;36517:6;36512:3;36454:70;:::i;:::-;36447:77;;36533:52;36578:6;36573:3;36566:4;36559:5;36555:16;36533:52;:::i;:::-;36610:29;36632:6;36610:29;:::i;:::-;36605:3;36601:39;36594:46;;36376:270;36286:360;;;;:::o;36652:640::-;36847:4;36885:3;36874:9;36870:19;36862:27;;36899:71;36967:1;36956:9;36952:17;36943:6;36899:71;:::i;:::-;36980:72;37048:2;37037:9;37033:18;37024:6;36980:72;:::i;:::-;37062;37130:2;37119:9;37115:18;37106:6;37062:72;:::i;:::-;37181:9;37175:4;37171:20;37166:2;37155:9;37151:18;37144:48;37209:76;37280:4;37271:6;37209:76;:::i;:::-;37201:84;;36652:640;;;;;;;:::o;37298:141::-;37354:5;37385:6;37379:13;37370:22;;37401:32;37427:5;37401:32;:::i;:::-;37298:141;;;;:::o;37445:349::-;37514:6;37563:2;37551:9;37542:7;37538:23;37534:32;37531:119;;;37569:79;;:::i;:::-;37531:119;37689:1;37714:63;37769:7;37760:6;37749:9;37745:22;37714:63;:::i;:::-;37704:73;;37660:127;37445:349;;;;:::o;37800:170::-;37940:22;37936:1;37928:6;37924:14;37917:46;37800:170;:::o;37976:366::-;38118:3;38139:67;38203:2;38198:3;38139:67;:::i;:::-;38132:74;;38215:93;38304:3;38215:93;:::i;:::-;38333:2;38328:3;38324:12;38317:19;;37976:366;;;:::o;38348:419::-;38514:4;38552:2;38541:9;38537:18;38529:26;;38601:9;38595:4;38591:20;38587:1;38576:9;38572:17;38565:47;38629:131;38755:4;38629:131;:::i;:::-;38621:139;;38348:419;;;:::o
Swarm Source
ipfs://80b73351f15b381e7405add4d3f201a430d1706bfcefa6ed0334628098ef94c6
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.