Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 306 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 18019378 | 483 days ago | IN | 0 ETH | 0.00101353 | ||||
Set Approval For... | 17834863 | 509 days ago | IN | 0 ETH | 0.00093884 | ||||
Transfer From | 17834642 | 509 days ago | IN | 0 ETH | 0.00140946 | ||||
Withdraw | 17834609 | 509 days ago | IN | 0 ETH | 0.00055048 | ||||
Safe Transfer Fr... | 17834578 | 509 days ago | IN | 0 ETH | 0.00103515 | ||||
Set Approval For... | 17834554 | 509 days ago | IN | 0 ETH | 0.00078413 | ||||
Set Approval For... | 17834541 | 509 days ago | IN | 0 ETH | 0.00075987 | ||||
Stake | 17834540 | 509 days ago | IN | 0 ETH | 0.00055922 | ||||
Stake | 17834538 | 509 days ago | IN | 0 ETH | 0.00056422 | ||||
Stake | 17834537 | 509 days ago | IN | 0 ETH | 0.00055909 | ||||
Stake | 17834536 | 509 days ago | IN | 0 ETH | 0.00056397 | ||||
Stake | 17834534 | 509 days ago | IN | 0 ETH | 0.00059591 | ||||
Set Approval For... | 17834505 | 509 days ago | IN | 0 ETH | 0.00109767 | ||||
Stake | 17834501 | 509 days ago | IN | 0 ETH | 0.00089118 | ||||
Mint | 17834486 | 509 days ago | IN | 0.099 ETH | 0.00162481 | ||||
Set Approval For... | 17834447 | 509 days ago | IN | 0 ETH | 0.00116861 | ||||
Set Approval For... | 17834442 | 509 days ago | IN | 0 ETH | 0.00117227 | ||||
Mint | 17834441 | 509 days ago | IN | 0.099 ETH | 0.00187297 | ||||
Whitelist Mint | 17834431 | 509 days ago | IN | 0 ETH | 0.00109211 | ||||
Whitelist Mint | 17834431 | 509 days ago | IN | 0 ETH | 0.00109211 | ||||
Whitelist Mint | 17834431 | 509 days ago | IN | 0 ETH | 0.00109211 | ||||
Whitelist Mint | 17834430 | 509 days ago | IN | 0 ETH | 0.00110985 | ||||
Set Approval For... | 17834419 | 509 days ago | IN | 0 ETH | 0.00111157 | ||||
Mint | 17834411 | 509 days ago | IN | 0.099 ETH | 0.00142541 | ||||
Stake | 17834406 | 509 days ago | IN | 0 ETH | 0.00075833 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
17834609 | 509 days ago | 3.366 ETH |
Loading...
Loading
Contract Name:
MagicalBeings
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-07-30 */ // File: Strings.sol pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: 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 make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: 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) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: 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 () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: Constants.sol pragma solidity ^0.8.13; address constant CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS = 0x000000000000AAeB6D7670E522A718067333cd4E; address constant CANONICAL_CORI_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6; // File: IOperatorFilterRegistry.sol pragma solidity ^0.8.13; interface IOperatorFilterRegistry { /** * @notice Returns true if operator is not filtered for a given token, either by address or codeHash. Also returns * true if supplied registrant address is not registered. */ function isOperatorAllowed( address registrant, address operator ) external view returns (bool); /** * @notice Registers an address with the registry. May be called by address itself or by EIP-173 owner. */ function register(address registrant) external; /** * @notice Registers an address with the registry and "subscribes" to another address's filtered operators and codeHashes. */ function registerAndSubscribe( address registrant, address subscription ) external; /** * @notice Registers an address with the registry and copies the filtered operators and codeHashes from another * address without subscribing. */ function registerAndCopyEntries( address registrant, address registrantToCopy ) external; /** * @notice Unregisters an address with the registry and removes its subscription. May be called by address itself or by EIP-173 owner. * Note that this does not remove any filtered addresses or codeHashes. * Also note that any subscriptions to this registrant will still be active and follow the existing filtered addresses and codehashes. */ function unregister(address addr) external; /** * @notice Update an operator address for a registered address - when filtered is true, the operator is filtered. */ function updateOperator( address registrant, address operator, bool filtered ) external; /** * @notice Update multiple operators for a registered address - when filtered is true, the operators will be filtered. Reverts on duplicates. */ function updateOperators( address registrant, address[] calldata operators, bool filtered ) external; /** * @notice Update a codeHash for a registered address - when filtered is true, the codeHash is filtered. */ function updateCodeHash( address registrant, bytes32 codehash, bool filtered ) external; /** * @notice Update multiple codeHashes for a registered address - when filtered is true, the codeHashes will be filtered. Reverts on duplicates. */ function updateCodeHashes( address registrant, bytes32[] calldata codeHashes, bool filtered ) external; /** * @notice Subscribe an address to another registrant's filtered operators and codeHashes. Will remove previous * subscription if present. * Note that accounts with subscriptions may go on to subscribe to other accounts - in this case, * subscriptions will not be forwarded. Instead the former subscription's existing entries will still be * used. */ function subscribe( address registrant, address registrantToSubscribe ) external; /** * @notice Unsubscribe an address from its current subscribed registrant, and optionally copy its filtered operators and codeHashes. */ function unsubscribe(address registrant, bool copyExistingEntries) external; /** * @notice Get the subscription address of a given registrant, if any. */ function subscriptionOf(address addr) external returns (address registrant); /** * @notice Get the set of addresses subscribed to a given registrant. * Note that order is not guaranteed as updates are made. */ function subscribers( address registrant ) external returns (address[] memory); /** * @notice Get the subscriber at a given index in the set of addresses subscribed to a given registrant. * Note that order is not guaranteed as updates are made. */ function subscriberAt( address registrant, uint256 index ) external returns (address); /** * @notice Copy filtered operators and codeHashes from a different registrantToCopy to addr. */ function copyEntriesOf( address registrant, address registrantToCopy ) external; /** * @notice Returns true if operator is filtered by a given address or its subscription. */ function isOperatorFiltered( address registrant, address operator ) external returns (bool); /** * @notice Returns true if the hash of an address's code is filtered by a given address or its subscription. */ function isCodeHashOfFiltered( address registrant, address operatorWithCode ) external returns (bool); /** * @notice Returns true if a codeHash is filtered by a given address or its subscription. */ function isCodeHashFiltered( address registrant, bytes32 codeHash ) external returns (bool); /** * @notice Returns a list of filtered operators for a given address or its subscription. */ function filteredOperators( address addr ) external returns (address[] memory); /** * @notice Returns the set of filtered codeHashes for a given address or its subscription. * Note that order is not guaranteed as updates are made. */ function filteredCodeHashes( address addr ) external returns (bytes32[] memory); /** * @notice Returns the filtered operator at the given index of the set of filtered operators for a given address or * its subscription. * Note that order is not guaranteed as updates are made. */ function filteredOperatorAt( address registrant, uint256 index ) external returns (address); /** * @notice Returns the filtered codeHash at the given index of the list of filtered codeHashes for a given address or * its subscription. * Note that order is not guaranteed as updates are made. */ function filteredCodeHashAt( address registrant, uint256 index ) external returns (bytes32); /** * @notice Returns true if an address has registered */ function isRegistered(address addr) external returns (bool); /** * @dev Convenience method to compute the code hash of an arbitrary contract */ function codeHashOf(address addr) external returns (bytes32); } // File: 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. * Please note that if your token contract does not provide an owner with EIP-173, it must provide * administration methods on the contract itself to interact with the registry otherwise the subscription * will be locked to the options set during construction. */ abstract contract OperatorFilterer { /// @dev Emitted when an operator is not allowed. error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS); /// @dev The constructor that is called when the contract is being deployed. 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)); } } } } /** * @dev A helper function to check if an operator is allowed. */ 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); } _; } /** * @dev A helper function to check if an operator approval is allowed. */ modifier onlyAllowedOperatorApproval(address operator) virtual { _checkFilterOperator(operator); _; } /** * @dev A helper function to check if an operator is allowed. */ 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) { // under normal circumstances, this function will revert rather than return false, but inheriting contracts // may specify their own OperatorFilterRegistry implementations, which may behave differently if ( !OPERATOR_FILTER_REGISTRY.isOperatorAllowed( address(this), operator ) ) { revert OperatorNotAllowed(operator); } } } } // File: DefaultOperatorFilterer.sol pragma solidity ^0.8.13; /** * @title DefaultOperatorFilterer * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription. * @dev Please note that if your token contract does not provide an owner with EIP-173, it must provide * administration methods on the contract itself to interact with the registry otherwise the subscription * will be locked to the options set during construction. */ abstract contract DefaultOperatorFilterer is OperatorFilterer { /// @dev The constructor that is called when the contract is being deployed. constructor() OperatorFilterer(CANONICAL_CORI_SUBSCRIPTION, true) {} } // File: 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.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; mapping(uint256 => TokenOwnership) private _ownerships; // ============================================================= // 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 - _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.selector); 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.selector); 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 Returns whether the ownership slot at `index` is initialized. * An uninitialized slot does not necessarily mean that the slot has no owner. */ function _ownershipIsInitialized( uint256 index ) internal view virtual returns (bool) { return _packedOwnerships[index] != 0; } /** * @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 packed) { if (_startTokenId() <= tokenId) { packed = _packedOwnerships[tokenId]; // If the data at the starting slot does not exist, start the scan. if (packed == 0) { if (tokenId >= _currentIndex) _revert(OwnerQueryForNonexistentToken.selector); // 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, `tokenId` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. for (;;) { unchecked { packed = _packedOwnerships[--tokenId]; } if (packed == 0) continue; if (packed & _BITMASK_BURNED == 0) return packed; // Otherwise, the token is burned, and we must revert. // This handles the case of batch burned tokens, where only the burned bit // of the starting slot is set, and remaining slots are left uninitialized. _revert(OwnerQueryForNonexistentToken.selector); } } // Otherwise, the data exists and we can skip the scan. // This is possible because we have already achieved the target condition. // This saves 2143 gas on transfers of initialized tokens. // If the token is not burned, return `packed`. Otherwise, revert. if (packed & _BITMASK_BURNED == 0) return packed; } _revert(OwnerQueryForNonexistentToken.selector); } /** * @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. See {ERC721A-_approve}. * * Requirements: * * - The caller must own the token or be an approved operator. */ function approve( address to, uint256 tokenId ) public payable virtual override { _approve(to, tokenId, true); } /** * @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.selector); 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 result) { if (_startTokenId() <= tokenId) { if (tokenId < _currentIndex) { uint256 packed; while ((packed = _packedOwnerships[tokenId]) == 0) --tokenId; result = packed & _BITMASK_BURNED == 0; } } } /** * @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); // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean. from = address(uint160(uint256(uint160(from)) & _BITMASK_ADDRESS)); if (address(uint160(prevOwnershipPacked)) != from) _revert(TransferFromIncorrectOwner.selector); ( 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.selector); _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; } } } } // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. uint256 toMasked = uint256(uint160(to)) & _BITMASK_ADDRESS; assembly { // 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. from, // `from`. toMasked, // `to`. tokenId // `tokenId`. ) } if (toMasked == 0) _revert(TransferToZeroAddress.selector); _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.selector); } } /** * @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.selector); } 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.selector); _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: // - `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) ); // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. uint256 toMasked = uint256(uint160(to)) & _BITMASK_ADDRESS; if (toMasked == 0) _revert(MintToZeroAddress.selector); uint256 end = startTokenId + quantity; uint256 tokenId = startTokenId; do { assembly { // 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`. tokenId // `tokenId`. ) } // The `!=` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. } while (++tokenId != end); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) _revert(MintToZeroAddress.selector); if (quantity == 0) _revert(MintZeroQuantity.selector); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) _revert(MintERC2309QuantityExceedsLimit.selector); _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.selector ); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) _revert(bytes4(0)); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ""); } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Equivalent to `_approve(to, tokenId, false)`. */ function _approve(address to, uint256 tokenId) internal virtual { _approve(to, tokenId, false); } /** * @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: * * - `tokenId` must exist. * * Emits an {Approval} event. */ function _approve( address to, uint256 tokenId, bool approvalCheck ) internal virtual { address owner = ownerOf(tokenId); if (approvalCheck && _msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { _revert(ApprovalCallerNotOwnerNorApproved.selector); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } // ============================================================= // 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.selector); } _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.selector); 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) } } /** * @dev For more efficient reverts. */ function _revert(bytes4 errorSelector) internal pure { assembly { mstore(0x00, errorSelector) revert(0x00, 0x04) } } } // File: Project.sol pragma solidity ^0.8.0; contract MagicalBeings is Ownable, ERC721A, ReentrancyGuard, DefaultOperatorFilterer { uint256 public maxSupply = 999; uint256 public maxMintPerTx = 5; uint256 public price = 0.099 * 10 ** 18; bool public publicPaused = true; bool public revealed = false; string public baseURI; string public hiddenMetadataUri = "ipfs://bafkreib7p6y2gfb4a3f5r2lweakxic4foou5qftdrq2ajtkj2f5wpjaiae"; mapping(address => bool) public isAllowedToMint; constructor() ERC721A("Magical Beings", "MBE") { initializeWhitelist(); } function mint(uint256 amount) external payable { uint256 ts = totalSupply(); require(publicPaused == false, "Mint not open for public"); require(ts + amount <= maxSupply, "Purchase would exceed max tokens"); require( amount <= maxMintPerTx, "Amount should not exceed max mint number" ); require(msg.value >= price * amount, "Please send the exact amount."); _safeMint(msg.sender, amount); } function openPublicMint(bool paused) external onlyOwner { publicPaused = paused; } function setPrice(uint256 _price) external onlyOwner { price = _price; } function whitelistStop(uint256 _maxSupply) external onlyOwner { maxSupply = _maxSupply; } function setMaxPerTx(uint256 _maxMintPerTx) external onlyOwner { maxMintPerTx = _maxMintPerTx; } function updateMetadata(string calldata _newMetadata) external onlyOwner { hiddenMetadataUri = _newMetadata; } function setRevealed(bool _state) public onlyOwner { revealed = _state; } function setBaseURI(string calldata newBaseURI) external onlyOwner { baseURI = newBaseURI; } function _baseURI() internal view override returns (string memory) { return baseURI; } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require(_exists(_tokenId),"ERC721Metadata: URI query for nonexistent token"); if (revealed == false) {return hiddenMetadataUri;} string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, Strings.toString(_tokenId))): ""; } function withdraw() external onlyOwner nonReentrant { (bool success, ) = msg.sender.call{value: address(this).balance}(""); require(success, "Transfer failed."); } function stake(uint256 tokenId) external onlyOwner { _burn(tokenId); } // OVERRIDDEN PUBLIC WRITE CONTRACT FUNCTIONS: OpenSea's Royalty Filterer Implementation. // function approve( address operator, uint256 tokenId ) public payable override onlyAllowedOperatorApproval(operator) { super.approve(operator, tokenId); } function setApprovalForAll( address operator, bool approved ) public override onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } function safeTransferFrom( address from, address to, uint256 tokenId ) public payable override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public payable override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } function transferFrom( address from, address to, uint256 tokenId ) public payable override onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } // WHITELIST function whitelistMint(uint256 amount) public payable { uint256 ts = totalSupply(); require(ts + amount <= maxSupply, "Purchase would exceed max tokens"); require(isAllowedToMint[msg.sender], "You are not on whitelist"); _safeMint(msg.sender, amount); } function zadw(address _address) external onlyOwner { isAllowedToMint[_address] = true; } function zadbw(address[] calldata _addresses) external onlyOwner { for (uint i = 0; i < _addresses.length; i++) { isAllowedToMint[_addresses[i]] = true; } } function initializeWhitelist() private { isAllowedToMint[0x0926e606ffB8e79103c28Fb4Fa303af0d1dB746E] = true; isAllowedToMint[0xcD92A511B4C1730a6488Be73C9c9Ea775396c10a] = true; isAllowedToMint[0x5D98f1c513DED35Ba1C0148bBeB8aA1a0EfED5EC] = true; isAllowedToMint[0xcbc6863808d871B0F33f911Db97b3033529Ab555] = true; isAllowedToMint[0x337c0Cc021cc77844657b6421Ca3142d27C358cb] = true; isAllowedToMint[0x08B3f3Ae219a5483352782B9F074EAA79CF2f984] = true; isAllowedToMint[0x47884Ae4921188D505494497fF74Add6e83F4301] = true; isAllowedToMint[0x29438a040e84b521B9823a095DDCBb1221ecbe00] = true; isAllowedToMint[0xD23dC6d8313C22904E783d914ED5D9021D114CF0] = true; isAllowedToMint[0x9FdC880cC4d02BBA060BF906B7e0131D6dE6B3A2] = true; isAllowedToMint[0x8b53A7fBc80CBe0F608FFb11547c5C7e8D65C423] = true; isAllowedToMint[0x9fddb98a087d44D5BAF76386C1711791e98eb0d8] = true; isAllowedToMint[0x61b73dEB05e3F657ec643DC9B3B69A9B1188cb53] = true; isAllowedToMint[0xAA5A7DE922032176cF83423c1e3aA0cbF61EED65] = true; isAllowedToMint[0xA763aF9ADd009A9aaF53656B8790fEa59Dc00aa0] = true; isAllowedToMint[0x52aC0EC08F05EF03B3e1415F77247ec85621eb0F] = true; isAllowedToMint[0xB035b3Ef5312E66e0Bb9Fac7C462DaEB0501EA9d] = true; isAllowedToMint[0x67Bc30eBDb136539275942e5F68BA569b2F7b0fD] = true; isAllowedToMint[0x1C10b50E32ed884a4C961d6f2785EA48538c5F05] = true; isAllowedToMint[0xF28644dd522F0d3333BbeE5566fE517524ed93b9] = true; isAllowedToMint[0xe86F54c513A75b08025409362046955C03EF2CA2] = true; isAllowedToMint[0xEaFD0421C6e70CDd103204672c21457499949F10] = true; isAllowedToMint[0xc637d4C76d9198E3A4A06987ea4022b2c2DCeA29] = true; isAllowedToMint[0x251c3461146b2b9760ac0D0bEa9D8123fbd3feD9] = true; isAllowedToMint[0x5dd4A8d314E7C85Bfe21F7a2392A191933d4A528] = true; isAllowedToMint[0x589DadAcc721CFEA59278C265Ca7382228090Ec0] = true; isAllowedToMint[0x391Bd20468c0f443fa13469b0bf1F276fA5FA138] = true; isAllowedToMint[0x42559172E9bf1F50b8D5745468D1BA131267C4BC] = true; isAllowedToMint[0xF6DEBc8A60D34475B13eB9e7B485765FC2bFBE91] = true; isAllowedToMint[0x9e45c386CabDE87A6DdB0D6e7cDcb56cEcC0C978] = true; isAllowedToMint[0xaBeaB3Cb8d58fd4594a875F6EB969C9B74075525] = true; isAllowedToMint[0x2CCDB292634aF0DB9C0F86e267Dc9ee17B8D1d94] = true; isAllowedToMint[0xB54E2FF577a7BC6FFEe77A91DaEC3464a6dD75BF] = true; isAllowedToMint[0xEdd2AeB345f0F3385810ADEE9575A8A8c0098833] = true; isAllowedToMint[0xa61347A67C908c2707dbF497c132919cD608938C] = true; isAllowedToMint[0x64486c87AbD61419C18201a1aEA95247d9654F98] = true; isAllowedToMint[0x4D920dB358E15D4f79d825df4bCeaC8D684ab8e7] = true; isAllowedToMint[0x5cc6258E9341F7C3562642851EcaEFa09a7368cF] = true; isAllowedToMint[0x0b4b574E849889Fa8b04EF157C7313882EBa1a0B] = true; isAllowedToMint[0x9458bAC8278D0755079f52A4032fd07Eb71151CB] = true; isAllowedToMint[0xEE987043817e5Db151F07a852488DA25F71069cF] = true; isAllowedToMint[0xefa358522BbC1aE43a063729C96638d04A4E7B7B] = true; isAllowedToMint[0x4BFE9c8422C37CAd341eAb3E940a4327B28BEfC1] = true; isAllowedToMint[0x45eb87Bf3823fcA12A8E4a795B20eD8daD03441B] = true; isAllowedToMint[0x23CC6b1Eb42BaF712f045CAda35AAE9CecB404f4] = true; isAllowedToMint[0x5dc46F200Ab761A3DF04534EaC72cd42D8274039] = true; isAllowedToMint[0x2C26c9420002938A365474d6B1cf63622D38dD83] = true; isAllowedToMint[0xFc11163969aFBDeA59803b34e751965857C066fa] = true; isAllowedToMint[0xAd67D0D13B9a7cD5F2D0112C9122cA198bc77E70] = true; isAllowedToMint[0xB9bE6910f57caB2FcbDa4B57CFBC2683b73c563c] = true; isAllowedToMint[0x2b50C15eaf8146064989Bd65c0FCE4B624454320] = true; isAllowedToMint[0x2f22770904cBFd819d1EA7835D4763c8f01F1653] = true; isAllowedToMint[0x7EB0CB8fD3cC993E4879c028c836C5038898a206] = true; isAllowedToMint[0x4cf504a2939967d67F52DfA024edB5BFF94fe0C5] = true; isAllowedToMint[0xE670d491BCB76b66E447A81fe4C1221d51E9D6f8] = true; isAllowedToMint[0x97981021c9972Db868944BD64bD5eB0D408c23E4] = true; isAllowedToMint[0xB2fc4bc64d8f58B3E0982e10828D6769aDcc7DFd] = true; isAllowedToMint[0xC0cae8a3F30ff53Da1999C9BB108124b6B57672c] = true; isAllowedToMint[0xca5908D63D9296fc971035554192829B40497796] = true; isAllowedToMint[0x27B6923d5462E0c9a649F4Db282FfAe11d07841f] = true; isAllowedToMint[0x3d74133c5129bB345DF481a696Dd2cB95C282bb4] = true; isAllowedToMint[0x536E4C8666B7f1898E1167A33cc0EE572d069c10] = true; isAllowedToMint[0x957938Afa1116Ce102982a6939750524A139857c] = true; isAllowedToMint[0x79Ba86E01538b36c1EC79EbfE1473B518b4A27A7] = true; isAllowedToMint[0xf0b835477B4C2e2A2bf7f147D4932822f4F0a171] = true; isAllowedToMint[0x657fEFdBf78C2cAF5de6Cb35e5EC40E5aAE43c17] = true; isAllowedToMint[0xA4286C30F6c4ba75a7d6F7A9caC9ed2C44922ff3] = true; isAllowedToMint[0x529637639B9f8e6EE51e45A83c2d4fCFe62B0A75] = true; isAllowedToMint[0xafEb7DC22f5192c240ED5dd5a9294B0FC83d1327] = true; isAllowedToMint[0x923B4D171e7Ef5d4Bb0B8e41A3856e1606Ed3C64] = true; isAllowedToMint[0x03E22137e082E8b136F7066a1b8F49904D0175bF] = true; isAllowedToMint[0xaEaa3b6Ad41C86BeFdE0bCA4adA7f23a38f5D12b] = true; isAllowedToMint[0x517cC855B105029c657B09060329545201f63655] = true; isAllowedToMint[0x864b88C55D2F8B3B91E5cF3B8Bd5b52726Ae0bCb] = true; isAllowedToMint[0x96414eeA7b5AC686E5021Ad4Ae44064703E6edF7] = true; isAllowedToMint[0x39a8ECB2491103A7320f4de2Cf5d8CE85F94c78a] = true; isAllowedToMint[0x841f7d6a0ABdB6Bf2c2647764FB5F001e7fB80C0] = true; isAllowedToMint[0xE0B8484581ceb9fCBDEFA05073472e834935A1Ad] = true; isAllowedToMint[0xC9C88bf0D3C51B53D1C2A26dbD5EaA54B707ffB4] = true; isAllowedToMint[0xf39210C0Ff598b59Cd3Bf6869F036BACc3945b78] = true; isAllowedToMint[0x04B30EFCEa69682c60F7eeB2AE5a6F7acA378445] = true; isAllowedToMint[0xD38474E28687990220F4A9fE1b8E995b6e18D9d1] = true; isAllowedToMint[0x45b6BF94dF32BEd3887fe7b7613D8fcB18485928] = true; isAllowedToMint[0xc9d5f905Aa44fa55d6c65CEC92563F8Fa4AC57A8] = true; isAllowedToMint[0xF60D6FF91C85b11759F730AcBeF26bE67947AECc] = true; isAllowedToMint[0xb0B358Cab9A59Fc741F0a8d22A5C458b7e84e731] = true; isAllowedToMint[0x5C2086B95E26Dd29226901dC89239a74De97CE3D] = true; isAllowedToMint[0x1cCEA8180976c5B4062bDfD08CeC23f8bFBD9104] = true; isAllowedToMint[0x1EB185b71d2d792596DB879424b7802fA21493D2] = true; isAllowedToMint[0x356Df3A19e68f5495Cb23D725c58eBdBd90f7F0F] = true; isAllowedToMint[0x694d6313ddFc0d66ec6deeAED3F7F2f9dc2a7C4D] = true; isAllowedToMint[0xFD98cae7199Ce046efF3284DB5ae9A111221880f] = true; isAllowedToMint[0x2D388b80BdcBE42Ef8D43769edB82E295C3ED785] = true; isAllowedToMint[0xCBBef0da74244298bE3DD73DE6d2fcA82e80A53C] = true; isAllowedToMint[0x2CF1E4Aa73944f03736eb63c5A96c114d4FD0933] = true; isAllowedToMint[0xdFfD8cAe6FB1C34005bD938bf1CFf8D403Dd67Da] = true; isAllowedToMint[0x569D540231aD68bf756B1e283994A9A83a95a414] = true; isAllowedToMint[0xc967C53f5475F30e3998F2039500983e375bf4c0] = true; isAllowedToMint[0x33F48aa1242A3279f2ac2B087fC16E7476009528] = true; isAllowedToMint[0x998b7dDad8d57E758fE767ba5Cf83387165832Bf] = true; isAllowedToMint[0xAe412a40fBC004366c68Aa160Aa9DA8EA56DeBE2] = true; isAllowedToMint[0xaA11276501EB0018b238914629026a4Af830C2C1] = true; isAllowedToMint[0xc3d93500CE41628E96Bb36d93EF6f77E8B3Dc446] = true; isAllowedToMint[0xE84BAA73949415d838f8dAe39d52945AdCB46475] = true; isAllowedToMint[0x0ce3E8C5a2718B4E06A4C31e9D9BF011614Bf5b6] = true; isAllowedToMint[0x08e59DAEDb7Ed930FD6BF8E099B612c9e7B9eC4B] = true; isAllowedToMint[0x93cCE694B97282e7a69dC157603F3BED78b41a21] = true; isAllowedToMint[0xF07EDA7433c3203Fa0cd4088D4dF52dB2fe90397] = true; isAllowedToMint[0x81A34735fFeB9DC7C90131c009a426a9840DD7B8] = true; isAllowedToMint[0xC670C0326559c17dAeAEd24c52fa54EA8820dC3D] = true; isAllowedToMint[0x73659760022fd256a0509a9a25e056CD4a02c763] = true; isAllowedToMint[0x6B9A11AC0a362519F53118785D98D27AdD75fD18] = true; isAllowedToMint[0xcAf427CA2D72bd867f2ca2C6E35b62697dF5Fa7d] = true; isAllowedToMint[0x89253b546F5cc6cBe9F1eAd52B38468Bdf4a9c7E] = true; isAllowedToMint[0x5b5fA09C1fFeC30E7590137f0AFCb1529705a9C2] = true; isAllowedToMint[0x71e28F8839ebFCBFe6AF90E77e5789fB26cD3fBF] = true; isAllowedToMint[0x718B7707E0EE9EC983bc83a54C5f7C62955B36e3] = true; isAllowedToMint[0x4d9Fc5e83DcAC3f742d6929b3Bf36dcDf93Ee66d] = true; isAllowedToMint[0x3844644337B0Fda77830B31C88413154b1339b9e] = true; isAllowedToMint[0x73A48659C2A884BaedFb5Df8023BB4d9A94Af1C2] = true; isAllowedToMint[0x4F94f9d826ed9E47d3227Cc37e26BF50930BA295] = true; isAllowedToMint[0x1420A6d3Bd2D7e30fff8e07414bE8d55406274aF] = true; isAllowedToMint[0x4C853d4BBd907Cd8cef2f595C96362591415b4F5] = true; isAllowedToMint[0x53479485affF8111E75a5daCF29246Cb70cCeaF7] = true; isAllowedToMint[0xd94ccbcBa1bef6Bf3fa7a97F0299dE984bA1b634] = true; isAllowedToMint[0x3B92D79e5b65041Bc9E88beF4800B45EaE4499a3] = true; isAllowedToMint[0xe2302AFcBe209E51a2bB9fbe06799F01224F085f] = true; isAllowedToMint[0x68bA7dd1E35a44689a272a9B3f1e5D7Cc09dA90e] = true; isAllowedToMint[0xB17d7e959f8a8F4b9864A85E7acb7aCd8b832A91] = true; isAllowedToMint[0x27D544907f73BF751FD0D13d5780e05b75c5a267] = true; isAllowedToMint[0x52E32aAf984A011eDF55b4b86e5381A66642f49a] = true; isAllowedToMint[0x500196F38e53dE23641443165b0314A8423682F0] = true; isAllowedToMint[0xE034CeDbcdc289BE4Bc61F4ace8ef47578403062] = true; isAllowedToMint[0x71E0E966e0391193B2D1b96C57BE5819BbAad341] = true; isAllowedToMint[0x2918483b4A16D7639682C65736665CC6C96Ab70E] = true; isAllowedToMint[0x93855DdAaf9BAf65dc090A6b7d65271EBAC6b552] = true; isAllowedToMint[0x0c0F1d3cB916E13FDef7F495874ad44E0892F0bf] = true; isAllowedToMint[0x00b474Ed9CE1c18399477eE15C457f84DA0A977a] = true; isAllowedToMint[0x35005aD9a81C7dB23ae11d783E23Ec3060D90907] = true; isAllowedToMint[0x5D466AD026232C1Ec3d43975C2df4b2D02e7964A] = true; isAllowedToMint[0xdE556F16B9306750C5c93AA0bDAd94f624b9f77B] = true; isAllowedToMint[0xfE32E7F7f0301EE578D1d21e410E61a108b682Bb] = true; isAllowedToMint[0xD49b9805Be0C773A7eAe94bd786E08beadBB7D11] = true; isAllowedToMint[0x0945E14d0C8C24E9a82627F5a8f41e517E60D4a4] = true; isAllowedToMint[0xd712737Adba60936992D6818A68bB63D582955e7] = true; isAllowedToMint[0xD531960bD5057A6FA360A1F21A8f83BDdC13b788] = true; isAllowedToMint[0xc60Be35bD13c9e8f7544b289C9010e5EB7Bc7266] = true; isAllowedToMint[0xA20B32B367267A0252A0a9975F5feFf5a4C5d5FE] = true; isAllowedToMint[0xe46b7BE195c38cDc562BEF81C61205671eD3e5B2] = true; isAllowedToMint[0x2ea4eed3200b8e75E05A17EE4076f5BD77F799Ab] = true; isAllowedToMint[0x6a8253BE9d954bf9728886A85b891730aA518f0c] = true; isAllowedToMint[0x6387e6cB09DeE17F777276307E6942e7B6B1a278] = true; isAllowedToMint[0xCeBF066E12793888c344EBe716A5Dbf5e307c44f] = true; isAllowedToMint[0xFD3b9C2c41A3F815327d1A9B2cDA4E992B582e25] = true; isAllowedToMint[0xCAd0c8b6C84e70052323F2dcbdf42AeCB28352bE] = true; isAllowedToMint[0x8a838d82CFc7F1618bcff3cDd9FCD678C5e4a8bA] = true; isAllowedToMint[0x5fe4c0e9b73d83912D301C95656C153e328B9319] = true; isAllowedToMint[0x1FD5e9E51E59EEBC957B04787232f883b66D8dC4] = true; isAllowedToMint[0x51E52516D8a341b0655698298a101b233977d9F1] = true; isAllowedToMint[0x66378d4bc2EB12309358347366C4E2420fb19792] = true; isAllowedToMint[0xfa1115C0f30Add450AE8F72583c4e0B3F0f8bbb7] = true; isAllowedToMint[0xa3faf3416C41e636A7534926381EE31e78187B2E] = true; isAllowedToMint[0x867DD583D2D42DFF87C3Fa1f005E032Ac234Fc5a] = true; isAllowedToMint[0x46000b59dB9B307379bc902e009ab507D066Ac3F] = true; isAllowedToMint[0xb4CA9e456663B6D9518dbBCf6Ba07E4128f2DC03] = true; isAllowedToMint[0x46aFC0236902F1CDf9909c1E6dbE215977388916] = true; isAllowedToMint[0x608BD6c5c49aCB137b25ceccc0a0cE4ad98B64d6] = true; isAllowedToMint[0x14E36cc1d563FdF3AaA9eF21a2EAEF0aD55474ca] = true; isAllowedToMint[0x05220638e9c6Be2f071bBF0F9df0CC81C06ACDEA] = true; isAllowedToMint[0x4d28f797092DcEF630Cc59BB1caaBc93b7de5a9B] = true; isAllowedToMint[0x250Ac0b5C41265D26ca01F2d9F17D41c259cCf8c] = true; isAllowedToMint[0x7d2D1536E88030E7826b497caB2FE81F590DCe95] = true; isAllowedToMint[0xB3294A4eaF7c2ea2Db9d2285bef56963cC143554] = true; isAllowedToMint[0x203Ca48af9F0D021d713535F487b085B64546C72] = true; isAllowedToMint[0xF6C078D020Ea60443a7079037B96689Ad685C16c] = true; isAllowedToMint[0x7899716Da1A0A5bAC962c22da8DAcF51Caf39053] = true; isAllowedToMint[0xcdB157fBF0fcE8F4eE760A9e2E9725dc0d727c73] = true; isAllowedToMint[0x21b2262f6cD7c113A68300492f5CD52FcBAD9EE7] = true; isAllowedToMint[0xFadfe41a7038514CDA5D3D32d78d1921a5f15038] = true; isAllowedToMint[0x839eF5f1A6d2E48CacFcFaEa84d1D34ab93ed3F3] = true; isAllowedToMint[0xA2F66c73d955A287d9F8df7B77a473480C7be63E] = true; isAllowedToMint[0x85DFD0798dCEDE98401540dE2de4Ac86cb7ae748] = true; isAllowedToMint[0x196eB00958BA0e702A34b235266463f4A5055971] = true; isAllowedToMint[0xfdd1c0Bc5F5414a29B5E7E06D0745E668c213490] = true; isAllowedToMint[0xe076A4aaE2242cE93F9c4615C5567c66fD785663] = true; isAllowedToMint[0xf6eF96ABd5C607940a6772AF87768642ee7C5E6F] = true; isAllowedToMint[0x4E707D0310DC018EC1D4cf854C66ffD97D7e1126] = true; isAllowedToMint[0xA83436606F34aC3B11977fc42bc878BCF36C4292] = true; isAllowedToMint[0x829037175b2776974A425dea67A5B1352Dd82f39] = true; isAllowedToMint[0x4eBAe2517a30D4d3dc6C37814c08319FE6CCd189] = true; isAllowedToMint[0x3Cf17a449AD4ae85f5FE70dF89b616152b465291] = true; isAllowedToMint[0x15f29FC7e00f55D60bad38525bbB1056525B0971] = true; isAllowedToMint[0x2D8cfefA2A89E54ce9848D288DA483fA54387d90] = true; isAllowedToMint[0x906D92f8C9471d7F62C0056b82012918a434101F] = true; isAllowedToMint[0x28ec16d6D9017A8e5435bE9c87847714c4Ab0a05] = true; isAllowedToMint[0x086543b219E3B8d1B3c6ec2af360Bd01c84C6269] = true; isAllowedToMint[0x0E976751838fC1669aF577Db971ed9eeb88de161] = true; isAllowedToMint[0x68170E1EDed438E1c22A9eDd0553975c3cC59dFb] = true; isAllowedToMint[0x392Bbd449dE4Ec9DD08B08d29e9a1dcECC412592] = true; isAllowedToMint[0x282BF060A5Fb9562BA7E01D34369564c4d2aebBd] = true; isAllowedToMint[0x9f4C707678fc83abA33f3691262333cB09649558] = true; isAllowedToMint[0x3C057323842A25CC6852e700998a539BbB52a194] = true; isAllowedToMint[0x2ff7c260851A508694ff40b5569E068c13FF9624] = true; isAllowedToMint[0x65fa00da1ddDe78E4753986C07a14567cA6b6c1F] = true; isAllowedToMint[0xE502144Ef0DBbD2Bf9618902E92f2364E73ACf7c] = true; isAllowedToMint[0xC09E422Aeb7D7547C86332111dfe7D42cD1a0E3C] = true; isAllowedToMint[0x86D6b02947F1B2F81078686E7Cb59e13C4D4beb6] = true; isAllowedToMint[0xB77b757b0dCD328dF2F377a230D3e1c20bEFf477] = true; isAllowedToMint[0x6475891a2091f5cE1496Da8e6EE2F484382182b6] = true; isAllowedToMint[0x8500483eD54350c7790A714f361781199edafcbf] = true; isAllowedToMint[0xdEB11E61321187cA2cb554C48E9B48aD7bD80721] = true; isAllowedToMint[0x41C68e00F3BEB25Dc974f3A40b512c8187DA6148] = true; isAllowedToMint[0xDD6F7D13a4476a24C22cfA7CEAEDB8B8BE6EEC36] = true; isAllowedToMint[0x4345a682eb7450E7d8feD35668bD4cd08FeE95cf] = true; isAllowedToMint[0x50A24b38D7841C8674efd284a59651A62ED25392] = true; isAllowedToMint[0x67CCc681c93235c99d407114FE9AE4a39d57119f] = true; isAllowedToMint[0xcE88F8422a34865AF4B0f9510c9B97b41895DE66] = true; isAllowedToMint[0xD29c3069109bE589a7F489b5CDaCaa7674030A68] = true; isAllowedToMint[0x0FdD001eecacFC2b03881b5b7D9F08BC5D35855c] = true; isAllowedToMint[0x83164dCc5723de1da19750ae87cF255DD6E99335] = true; isAllowedToMint[0x7983d92A9E21EB444bE7Ba708981c8aE75Af787f] = true; isAllowedToMint[0xa9CcbdF9A69Df8D9a44CfBF55600C6cD180491f0] = true; isAllowedToMint[0xb9d177069D847937E2FCD4BCA2768595854e0588] = true; isAllowedToMint[0xD8a0D4f69Aea3658B20a0e5aC16c38496E163855] = true; isAllowedToMint[0x3bf5Af4F651dabB214236477745Ed04DabFB50AC] = true; isAllowedToMint[0xe3535A8bF3c11b359F7767555De650ce4C1f8FAa] = true; isAllowedToMint[0xbcAEe4241Afd4aFaF3767Ac1C25C883026Fb3886] = true; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAllowedToMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"maxMintPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"paused","type":"bool"}],"name":"openPublicMint","outputs":[],"stateMutability":"nonpayable","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":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"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":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintPerTx","type":"uint256"}],"name":"setMaxPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newMetadata","type":"string"}],"name":"updateMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"whitelistStop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"zadbw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"zadw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526103e7600b556005600c5567015fb7f9b8c38000600d556001600e60006101000a81548160ff0219169083151502179055506000600e60016101000a81548160ff0219169083151502179055506040518060800160405280604281526020016200a8d960429139601090816200007b91906200665a565b503480156200008957600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600e81526020017f4d61676963616c204265696e67730000000000000000000000000000000000008152506040518060400160405280600381526020017f4d4245000000000000000000000000000000000000000000000000000000000081525060006200011f6200040e60201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3508160039081620001ce91906200665a565b508060049081620001e091906200665a565b50620001f16200041660201b60201c565b60018190555050506001600a8190555060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620003f6578015620002bc576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200028292919062006786565b600060405180830381600087803b1580156200029d57600080fd5b505af1158015620002b2573d6000803e3d6000fd5b50505050620003f5565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000376576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200033c92919062006786565b600060405180830381600087803b1580156200035757600080fd5b505af11580156200036c573d6000803e3d6000fd5b50505050620003f4565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620003bf9190620067b3565b600060405180830381600087803b158015620003da57600080fd5b505af1158015620003ef573d6000803e3d6000fd5b505050505b5b5b5050620004086200041b60201b60201c565b620067d0565b600033905090565b600090565b600160116000730926e606ffb8e79103c28fb4fa303af0d1db746e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073cd92a511b4c1730a6488be73c9c9ea775396c10a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000735d98f1c513ded35ba1c0148bbeb8aa1a0efed5ec73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073cbc6863808d871b0f33f911db97b3033529ab55573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073337c0cc021cc77844657b6421ca3142d27c358cb73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007308b3f3ae219a5483352782b9f074eaa79cf2f98473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007347884ae4921188d505494497ff74add6e83f430173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007329438a040e84b521b9823a095ddcbb1221ecbe0073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073d23dc6d8313c22904e783d914ed5d9021d114cf073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000739fdc880cc4d02bba060bf906b7e0131d6de6b3a273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000738b53a7fbc80cbe0f608ffb11547c5c7e8d65c42373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000739fddb98a087d44d5baf76386c1711791e98eb0d873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007361b73deb05e3f657ec643dc9b3b69a9b1188cb5373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073aa5a7de922032176cf83423c1e3aa0cbf61eed6573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073a763af9add009a9aaf53656b8790fea59dc00aa073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007352ac0ec08f05ef03b3e1415f77247ec85621eb0f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073b035b3ef5312e66e0bb9fac7c462daeb0501ea9d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007367bc30ebdb136539275942e5f68ba569b2f7b0fd73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000731c10b50e32ed884a4c961d6f2785ea48538c5f0573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073f28644dd522f0d3333bbee5566fe517524ed93b973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073e86f54c513a75b08025409362046955c03ef2ca273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073eafd0421c6e70cdd103204672c21457499949f1073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073c637d4c76d9198e3a4a06987ea4022b2c2dcea2973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073251c3461146b2b9760ac0d0bea9d8123fbd3fed973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000735dd4a8d314e7c85bfe21f7a2392a191933d4a52873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073589dadacc721cfea59278c265ca7382228090ec073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073391bd20468c0f443fa13469b0bf1f276fa5fa13873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007342559172e9bf1f50b8d5745468d1ba131267c4bc73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073f6debc8a60d34475b13eb9e7b485765fc2bfbe9173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000739e45c386cabde87a6ddb0d6e7cdcb56cecc0c97873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073abeab3cb8d58fd4594a875f6eb969c9b7407552573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000732ccdb292634af0db9c0f86e267dc9ee17b8d1d9473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073b54e2ff577a7bc6ffee77a91daec3464a6dd75bf73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073edd2aeb345f0f3385810adee9575a8a8c009883373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073a61347a67c908c2707dbf497c132919cd608938c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007364486c87abd61419c18201a1aea95247d9654f9873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000734d920db358e15d4f79d825df4bceac8d684ab8e773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000735cc6258e9341f7c3562642851ecaefa09a7368cf73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000730b4b574e849889fa8b04ef157c7313882eba1a0b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000739458bac8278d0755079f52a4032fd07eb71151cb73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073ee987043817e5db151f07a852488da25f71069cf73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073efa358522bbc1ae43a063729c96638d04a4e7b7b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000734bfe9c8422c37cad341eab3e940a4327b28befc173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007345eb87bf3823fca12a8e4a795b20ed8dad03441b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007323cc6b1eb42baf712f045cada35aae9cecb404f473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000735dc46f200ab761a3df04534eac72cd42d827403973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000732c26c9420002938a365474d6b1cf63622d38dd8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073fc11163969afbdea59803b34e751965857c066fa73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073ad67d0d13b9a7cd5f2d0112c9122ca198bc77e7073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073b9be6910f57cab2fcbda4b57cfbc2683b73c563c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000732b50c15eaf8146064989bd65c0fce4b62445432073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000732f22770904cbfd819d1ea7835d4763c8f01f165373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000737eb0cb8fd3cc993e4879c028c836c5038898a20673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000734cf504a2939967d67f52dfa024edb5bff94fe0c573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073e670d491bcb76b66e447a81fe4c1221d51e9d6f873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007397981021c9972db868944bd64bd5eb0d408c23e473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073b2fc4bc64d8f58b3e0982e10828d6769adcc7dfd73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073c0cae8a3f30ff53da1999c9bb108124b6b57672c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073ca5908d63d9296fc971035554192829b4049779673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007327b6923d5462e0c9a649f4db282ffae11d07841f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000733d74133c5129bb345df481a696dd2cb95c282bb473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073536e4c8666b7f1898e1167a33cc0ee572d069c1073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073957938afa1116ce102982a6939750524a139857c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007379ba86e01538b36c1ec79ebfe1473b518b4a27a773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073f0b835477b4c2e2a2bf7f147d4932822f4f0a17173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073657fefdbf78c2caf5de6cb35e5ec40e5aae43c1773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073a4286c30f6c4ba75a7d6f7a9cac9ed2c44922ff373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073529637639b9f8e6ee51e45a83c2d4fcfe62b0a7573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073afeb7dc22f5192c240ed5dd5a9294b0fc83d132773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073923b4d171e7ef5d4bb0b8e41a3856e1606ed3c6473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007303e22137e082e8b136f7066a1b8f49904d0175bf73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073aeaa3b6ad41c86befde0bca4ada7f23a38f5d12b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073517cc855b105029c657b09060329545201f6365573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073864b88c55d2f8b3b91e5cf3b8bd5b52726ae0bcb73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007396414eea7b5ac686e5021ad4ae44064703e6edf773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007339a8ecb2491103a7320f4de2cf5d8ce85f94c78a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073841f7d6a0abdb6bf2c2647764fb5f001e7fb80c073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073e0b8484581ceb9fcbdefa05073472e834935a1ad73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073c9c88bf0d3c51b53d1c2a26dbd5eaa54b707ffb473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073f39210c0ff598b59cd3bf6869f036bacc3945b7873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007304b30efcea69682c60f7eeb2ae5a6f7aca37844573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073d38474e28687990220f4a9fe1b8e995b6e18d9d173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007345b6bf94df32bed3887fe7b7613d8fcb1848592873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073c9d5f905aa44fa55d6c65cec92563f8fa4ac57a873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073f60d6ff91c85b11759f730acbef26be67947aecc73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073b0b358cab9a59fc741f0a8d22a5c458b7e84e73173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000735c2086b95e26dd29226901dc89239a74de97ce3d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000731ccea8180976c5b4062bdfd08cec23f8bfbd910473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000731eb185b71d2d792596db879424b7802fa21493d273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073356df3a19e68f5495cb23d725c58ebdbd90f7f0f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073694d6313ddfc0d66ec6deeaed3f7f2f9dc2a7c4d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073fd98cae7199ce046eff3284db5ae9a111221880f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000732d388b80bdcbe42ef8d43769edb82e295c3ed78573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073cbbef0da74244298be3dd73de6d2fca82e80a53c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000732cf1e4aa73944f03736eb63c5a96c114d4fd093373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073dffd8cae6fb1c34005bd938bf1cff8d403dd67da73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073569d540231ad68bf756b1e283994a9a83a95a41473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073c967c53f5475f30e3998f2039500983e375bf4c073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007333f48aa1242a3279f2ac2b087fc16e747600952873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073998b7ddad8d57e758fe767ba5cf83387165832bf73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073ae412a40fbc004366c68aa160aa9da8ea56debe273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073aa11276501eb0018b238914629026a4af830c2c173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073c3d93500ce41628e96bb36d93ef6f77e8b3dc44673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073e84baa73949415d838f8dae39d52945adcb4647573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000730ce3e8c5a2718b4e06a4c31e9d9bf011614bf5b673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007308e59daedb7ed930fd6bf8e099b612c9e7b9ec4b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007393cce694b97282e7a69dc157603f3bed78b41a2173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073f07eda7433c3203fa0cd4088d4df52db2fe9039773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007381a34735ffeb9dc7c90131c009a426a9840dd7b873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073c670c0326559c17daeaed24c52fa54ea8820dc3d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007373659760022fd256a0509a9a25e056cd4a02c76373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000736b9a11ac0a362519f53118785d98d27add75fd1873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073caf427ca2d72bd867f2ca2c6e35b62697df5fa7d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007389253b546f5cc6cbe9f1ead52b38468bdf4a9c7e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000735b5fa09c1ffec30e7590137f0afcb1529705a9c273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007371e28f8839ebfcbfe6af90e77e5789fb26cd3fbf73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073718b7707e0ee9ec983bc83a54c5f7c62955b36e373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000734d9fc5e83dcac3f742d6929b3bf36dcdf93ee66d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000733844644337b0fda77830b31c88413154b1339b9e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007373a48659c2a884baedfb5df8023bb4d9a94af1c273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000734f94f9d826ed9e47d3227cc37e26bf50930ba29573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000731420a6d3bd2d7e30fff8e07414be8d55406274af73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000734c853d4bbd907cd8cef2f595c96362591415b4f573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007353479485afff8111e75a5dacf29246cb70cceaf773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073d94ccbcba1bef6bf3fa7a97f0299de984ba1b63473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000733b92d79e5b65041bc9e88bef4800b45eae4499a373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073e2302afcbe209e51a2bb9fbe06799f01224f085f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007368ba7dd1e35a44689a272a9b3f1e5d7cc09da90e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073b17d7e959f8a8f4b9864a85e7acb7acd8b832a9173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007327d544907f73bf751fd0d13d5780e05b75c5a26773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007352e32aaf984a011edf55b4b86e5381a66642f49a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073500196f38e53de23641443165b0314a8423682f073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073e034cedbcdc289be4bc61f4ace8ef4757840306273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007371e0e966e0391193b2d1b96c57be5819bbaad34173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000732918483b4a16d7639682c65736665cc6c96ab70e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007393855ddaaf9baf65dc090a6b7d65271ebac6b55273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000730c0f1d3cb916e13fdef7f495874ad44e0892f0bf73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600072b474ed9ce1c18399477ee15c457f84da0a977a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007335005ad9a81c7db23ae11d783e23ec3060d9090773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000735d466ad026232c1ec3d43975c2df4b2d02e7964a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073de556f16b9306750c5c93aa0bdad94f624b9f77b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073fe32e7f7f0301ee578d1d21e410e61a108b682bb73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073d49b9805be0c773a7eae94bd786e08beadbb7d1173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000730945e14d0c8c24e9a82627f5a8f41e517e60d4a473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073d712737adba60936992d6818a68bb63d582955e773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073d531960bd5057a6fa360a1f21a8f83bddc13b78873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073c60be35bd13c9e8f7544b289c9010e5eb7bc726673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073a20b32b367267a0252a0a9975f5feff5a4c5d5fe73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073e46b7be195c38cdc562bef81c61205671ed3e5b273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000732ea4eed3200b8e75e05a17ee4076f5bd77f799ab73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000736a8253be9d954bf9728886a85b891730aa518f0c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000736387e6cb09dee17f777276307e6942e7b6b1a27873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073cebf066e12793888c344ebe716a5dbf5e307c44f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073fd3b9c2c41a3f815327d1a9b2cda4e992b582e2573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073cad0c8b6c84e70052323f2dcbdf42aecb28352be73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000738a838d82cfc7f1618bcff3cdd9fcd678c5e4a8ba73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000735fe4c0e9b73d83912d301c95656c153e328b931973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000731fd5e9e51e59eebc957b04787232f883b66d8dc473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007351e52516d8a341b0655698298a101b233977d9f173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007366378d4bc2eb12309358347366c4e2420fb1979273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073fa1115c0f30add450ae8f72583c4e0b3f0f8bbb773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073a3faf3416c41e636a7534926381ee31e78187b2e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073867dd583d2d42dff87c3fa1f005e032ac234fc5a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007346000b59db9b307379bc902e009ab507d066ac3f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073b4ca9e456663b6d9518dbbcf6ba07e4128f2dc0373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007346afc0236902f1cdf9909c1e6dbe21597738891673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073608bd6c5c49acb137b25ceccc0a0ce4ad98b64d673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007314e36cc1d563fdf3aaa9ef21a2eaef0ad55474ca73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007305220638e9c6be2f071bbf0f9df0cc81c06acdea73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000734d28f797092dcef630cc59bb1caabc93b7de5a9b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073250ac0b5c41265d26ca01f2d9f17d41c259ccf8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000737d2d1536e88030e7826b497cab2fe81f590dce9573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073b3294a4eaf7c2ea2db9d2285bef56963cc14355473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073203ca48af9f0d021d713535f487b085b64546c7273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073f6c078d020ea60443a7079037b96689ad685c16c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000737899716da1a0a5bac962c22da8dacf51caf3905373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073cdb157fbf0fce8f4ee760a9e2e9725dc0d727c7373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007321b2262f6cd7c113a68300492f5cd52fcbad9ee773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073fadfe41a7038514cda5d3d32d78d1921a5f1503873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073839ef5f1a6d2e48cacfcfaea84d1d34ab93ed3f373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073a2f66c73d955a287d9f8df7b77a473480c7be63e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007385dfd0798dcede98401540de2de4ac86cb7ae74873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073196eb00958ba0e702a34b235266463f4a505597173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073fdd1c0bc5f5414a29b5e7e06d0745e668c21349073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073e076a4aae2242ce93f9c4615c5567c66fd78566373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073f6ef96abd5c607940a6772af87768642ee7c5e6f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000734e707d0310dc018ec1d4cf854c66ffd97d7e112673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073a83436606f34ac3b11977fc42bc878bcf36c429273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073829037175b2776974a425dea67a5b1352dd82f3973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000734ebae2517a30d4d3dc6c37814c08319fe6ccd18973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000733cf17a449ad4ae85f5fe70df89b616152b46529173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007315f29fc7e00f55d60bad38525bbb1056525b097173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000732d8cfefa2a89e54ce9848d288da483fa54387d9073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073906d92f8c9471d7f62c0056b82012918a434101f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007328ec16d6d9017a8e5435be9c87847714c4ab0a0573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073086543b219e3b8d1b3c6ec2af360bd01c84c626973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000730e976751838fc1669af577db971ed9eeb88de16173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007368170e1eded438e1c22a9edd0553975c3cc59dfb73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073392bbd449de4ec9dd08b08d29e9a1dcecc41259273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073282bf060a5fb9562ba7e01d34369564c4d2aebbd73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000739f4c707678fc83aba33f3691262333cb0964955873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000733c057323842a25cc6852e700998a539bbb52a19473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000732ff7c260851a508694ff40b5569e068c13ff962473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007365fa00da1ddde78e4753986c07a14567ca6b6c1f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073e502144ef0dbbd2bf9618902e92f2364e73acf7c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073c09e422aeb7d7547c86332111dfe7d42cd1a0e3c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007386d6b02947f1b2f81078686e7cb59e13c4d4beb673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073b77b757b0dcd328df2f377a230d3e1c20beff47773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000736475891a2091f5ce1496da8e6ee2f484382182b673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000738500483ed54350c7790a714f361781199edafcbf73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073deb11e61321187ca2cb554c48e9b48ad7bd8072173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007341c68e00f3beb25dc974f3a40b512c8187da614873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073dd6f7d13a4476a24c22cfa7ceaedb8b8be6eec3673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000734345a682eb7450e7d8fed35668bd4cd08fee95cf73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007350a24b38d7841c8674efd284a59651a62ed2539273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007367ccc681c93235c99d407114fe9ae4a39d57119f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073ce88f8422a34865af4b0f9510c9b97b41895de6673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073d29c3069109be589a7f489b5cdacaa7674030a6873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000730fdd001eecacfc2b03881b5b7d9f08bc5d35855c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160007383164dcc5723de1da19750ae87cf255dd6e9933573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000737983d92a9e21eb444be7ba708981c8ae75af787f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073a9ccbdf9a69df8d9a44cfbf55600c6cd180491f073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073b9d177069d847937e2fcd4bca2768595854e058873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073d8a0d4f69aea3658b20a0e5ac16c38496e16385573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160116000733bf5af4f651dabb214236477745ed04dabfb50ac73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073e3535a8bf3c11b359f7767555de650ce4c1f8faa73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060016011600073bcaee4241afd4afaf3767ac1c25c883026fb388673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200646257607f821691505b6020821081036200647857620064776200641a565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620064e27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620064a3565b620064ee8683620064a3565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200653b620065356200652f8462006506565b62006510565b62006506565b9050919050565b6000819050919050565b62006557836200651a565b6200656f620065668262006542565b848454620064b0565b825550505050565b600090565b6200658662006577565b620065938184846200654c565b505050565b5b81811015620065bb57620065af6000826200657c565b60018101905062006599565b5050565b601f8211156200660a57620065d4816200647e565b620065df8462006493565b81016020851015620065ef578190505b62006607620065fe8562006493565b83018262006598565b50505b505050565b600082821c905092915050565b60006200662f600019846008026200660f565b1980831691505092915050565b60006200664a83836200661c565b9150826002028217905092915050565b6200666582620063e0565b67ffffffffffffffff811115620066815762006680620063eb565b5b6200668d825462006449565b6200669a828285620065bf565b600060209050601f831160018114620066d25760008415620066bd578287015190505b620066c985826200663c565b86555062006739565b601f198416620066e2866200647e565b60005b828110156200670c57848901518255600182019150602085019450602081019050620066e5565b868310156200672c578489015162006728601f8916826200661c565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200676e8262006741565b9050919050565b620067808162006761565b82525050565b60006040820190506200679d600083018562006775565b620067ac602083018462006775565b9392505050565b6000602082019050620067ca600083018462006775565b92915050565b6140f980620067e06000396000f3fe6080604052600436106102305760003560e01c8063918b5be11161012e578063b8ca64e4116100ab578063d5abeb011161006f578063d5abeb01146107c1578063de7fcb1d146107ec578063e0a8085314610817578063e985e9c514610840578063f2fde38b1461087d57610230565b8063b8ca64e4146106e0578063c6f6f21614610709578063c87b56dd14610732578063ce5299ab1461076f578063cebc68a71461079857610230565b8063a22cb465116100f2578063a22cb4651461061e578063a45ba8e714610647578063a694fc3a14610672578063af947cec1461069b578063b88d4fde146106c457610230565b8063918b5be11461055a57806391b7f5ed1461058357806395d89b41146105ac578063a035b1fe146105d7578063a0712d681461060257610230565b806342842e0e116101bc5780636c0360eb116101805780636c0360eb1461049457806370a08231146104bf578063715018a6146104fc578063868ff4a2146105135780638da5cb5b1461052f57610230565b806342842e0e146103aa5780634813d8a6146103c6578063518302271461040357806355f804b31461042e5780636352211e1461045757610230565b80630bb12bb8116102035780630bb12bb8146102f657806318160ddd1461032157806323b872dd1461034c5780633ccfd60b1461036857806341f434341461037f57610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190612df9565b6108a6565b6040516102699190612e41565b60405180910390f35b34801561027e57600080fd5b50610287610938565b6040516102949190612eec565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190612f44565b6109ca565b6040516102d19190612fb2565b60405180910390f35b6102f460048036038101906102ef9190612ff9565b610a28565b005b34801561030257600080fd5b5061030b610a41565b6040516103189190612e41565b60405180910390f35b34801561032d57600080fd5b50610336610a54565b6040516103439190613048565b60405180910390f35b61036660048036038101906103619190613063565b610a67565b005b34801561037457600080fd5b5061037d610ab6565b005b34801561038b57600080fd5b50610394610c36565b6040516103a19190613115565b60405180910390f35b6103c460048036038101906103bf9190613063565b610c48565b005b3480156103d257600080fd5b506103ed60048036038101906103e89190613130565b610c97565b6040516103fa9190612e41565b60405180910390f35b34801561040f57600080fd5b50610418610cb7565b6040516104259190612e41565b60405180910390f35b34801561043a57600080fd5b50610455600480360381019061045091906131c2565b610cca565b005b34801561046357600080fd5b5061047e60048036038101906104799190612f44565b610d5c565b60405161048b9190612fb2565b60405180910390f35b3480156104a057600080fd5b506104a9610d6e565b6040516104b69190612eec565b60405180910390f35b3480156104cb57600080fd5b506104e660048036038101906104e19190613130565b610dfc565b6040516104f39190613048565b60405180910390f35b34801561050857600080fd5b50610511610e93565b005b61052d60048036038101906105289190612f44565b610fcd565b005b34801561053b57600080fd5b506105446110c3565b6040516105519190612fb2565b60405180910390f35b34801561056657600080fd5b50610581600480360381019061057c91906131c2565b6110ec565b005b34801561058f57600080fd5b506105aa60048036038101906105a59190612f44565b61117e565b005b3480156105b857600080fd5b506105c1611204565b6040516105ce9190612eec565b60405180910390f35b3480156105e357600080fd5b506105ec611296565b6040516105f99190613048565b60405180910390f35b61061c60048036038101906106179190612f44565b61129c565b005b34801561062a57600080fd5b506106456004803603810190610640919061323b565b6113f1565b005b34801561065357600080fd5b5061065c61140a565b6040516106699190612eec565b60405180910390f35b34801561067e57600080fd5b5061069960048036038101906106949190612f44565b611498565b005b3480156106a757600080fd5b506106c260048036038101906106bd919061327b565b611520565b005b6106de60048036038101906106d991906133d8565b6115b9565b005b3480156106ec57600080fd5b5061070760048036038101906107029190612f44565b61160a565b005b34801561071557600080fd5b50610730600480360381019061072b9190612f44565b611690565b005b34801561073e57600080fd5b5061075960048036038101906107549190612f44565b611716565b6040516107669190612eec565b60405180910390f35b34801561077b57600080fd5b50610796600480360381019061079191906134b1565b61186b565b005b3480156107a457600080fd5b506107bf60048036038101906107ba9190613130565b61198c565b005b3480156107cd57600080fd5b506107d6611a63565b6040516107e39190613048565b60405180910390f35b3480156107f857600080fd5b50610801611a69565b60405161080e9190613048565b60405180910390f35b34801561082357600080fd5b5061083e6004803603810190610839919061327b565b611a6f565b005b34801561084c57600080fd5b50610867600480360381019061086291906134fe565b611b08565b6040516108749190612e41565b60405180910390f35b34801561088957600080fd5b506108a4600480360381019061089f9190613130565b611b9c565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061090157506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109315750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600380546109479061356d565b80601f01602080910402602001604051908101604052809291908181526020018280546109739061356d565b80156109c05780601f10610995576101008083540402835291602001916109c0565b820191906000526020600020905b8154815290600101906020018083116109a357829003601f168201915b5050505050905090565b60006109d582611d44565b6109ea576109e963cf4700e460e01b611dbd565b5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610a3281611dc7565b610a3c8383611ec4565b505050565b600e60009054906101000a900460ff1681565b6000610a5e611ed4565b60015403905090565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610aa557610aa433611dc7565b5b610ab0848484611ed9565b50505050565b610abe61219a565b73ffffffffffffffffffffffffffffffffffffffff16610adc6110c3565b73ffffffffffffffffffffffffffffffffffffffff1614610b32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b29906135ea565b60405180910390fd5b6002600a5403610b77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6e90613656565b60405180910390fd5b6002600a8190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610ba5906136a7565b60006040518083038185875af1925050503d8060008114610be2576040519150601f19603f3d011682016040523d82523d6000602084013e610be7565b606091505b5050905080610c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2290613708565b60405180910390fd5b506001600a81905550565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c8657610c8533611dc7565b5b610c918484846121a2565b50505050565b60116020528060005260406000206000915054906101000a900460ff1681565b600e60019054906101000a900460ff1681565b610cd261219a565b73ffffffffffffffffffffffffffffffffffffffff16610cf06110c3565b73ffffffffffffffffffffffffffffffffffffffff1614610d46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3d906135ea565b60405180910390fd5b8181600f9182610d579291906138d5565b505050565b6000610d67826121c2565b9050919050565b600f8054610d7b9061356d565b80601f0160208091040260200160405190810160405280929190818152602001828054610da79061356d565b8015610df45780601f10610dc957610100808354040283529160200191610df4565b820191906000526020600020905b815481529060010190602001808311610dd757829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e4257610e41638f4eb60460e01b611dbd565b5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610e9b61219a565b73ffffffffffffffffffffffffffffffffffffffff16610eb96110c3565b73ffffffffffffffffffffffffffffffffffffffff1614610f0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f06906135ea565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000610fd7610a54565b9050600b548282610fe891906139d4565b1115611029576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102090613a54565b60405180910390fd5b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166110b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ac90613ac0565b60405180910390fd5b6110bf33836122ae565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6110f461219a565b73ffffffffffffffffffffffffffffffffffffffff166111126110c3565b73ffffffffffffffffffffffffffffffffffffffff1614611168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115f906135ea565b60405180910390fd5b8181601091826111799291906138d5565b505050565b61118661219a565b73ffffffffffffffffffffffffffffffffffffffff166111a46110c3565b73ffffffffffffffffffffffffffffffffffffffff16146111fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f1906135ea565b60405180910390fd5b80600d8190555050565b6060600480546112139061356d565b80601f016020809104026020016040519081016040528092919081815260200182805461123f9061356d565b801561128c5780601f106112615761010080835404028352916020019161128c565b820191906000526020600020905b81548152906001019060200180831161126f57829003601f168201915b5050505050905090565b600d5481565b60006112a6610a54565b905060001515600e60009054906101000a900460ff161515146112fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f590613b2c565b60405180910390fd5b600b54828261130d91906139d4565b111561134e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134590613a54565b60405180910390fd5b600c54821115611393576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138a90613bbe565b60405180910390fd5b81600d546113a19190613bde565b3410156113e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113da90613c6c565b60405180910390fd5b6113ed33836122ae565b5050565b816113fb81611dc7565b61140583836122cc565b505050565b601080546114179061356d565b80601f01602080910402602001604051908101604052809291908181526020018280546114439061356d565b80156114905780601f1061146557610100808354040283529160200191611490565b820191906000526020600020905b81548152906001019060200180831161147357829003601f168201915b505050505081565b6114a061219a565b73ffffffffffffffffffffffffffffffffffffffff166114be6110c3565b73ffffffffffffffffffffffffffffffffffffffff1614611514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150b906135ea565b60405180910390fd5b61151d816123d7565b50565b61152861219a565b73ffffffffffffffffffffffffffffffffffffffff166115466110c3565b73ffffffffffffffffffffffffffffffffffffffff161461159c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611593906135ea565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146115f7576115f633611dc7565b5b611603858585856123e5565b5050505050565b61161261219a565b73ffffffffffffffffffffffffffffffffffffffff166116306110c3565b73ffffffffffffffffffffffffffffffffffffffff1614611686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167d906135ea565b60405180910390fd5b80600b8190555050565b61169861219a565b73ffffffffffffffffffffffffffffffffffffffff166116b66110c3565b73ffffffffffffffffffffffffffffffffffffffff161461170c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611703906135ea565b60405180910390fd5b80600c8190555050565b606061172182611d44565b611760576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175790613cfe565b60405180910390fd5b60001515600e60019054906101000a900460ff1615150361180d57601080546117889061356d565b80601f01602080910402602001604051908101604052809291908181526020018280546117b49061356d565b80156118015780601f106117d657610100808354040283529160200191611801565b820191906000526020600020905b8154815290600101906020018083116117e457829003601f168201915b50505050509050611866565b6000611817612437565b905060008151116118375760405180602001604052806000815250611862565b80611841846124c9565b604051602001611852929190613d5a565b6040516020818303038152906040525b9150505b919050565b61187361219a565b73ffffffffffffffffffffffffffffffffffffffff166118916110c3565b73ffffffffffffffffffffffffffffffffffffffff16146118e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118de906135ea565b60405180910390fd5b60005b828290508110156119875760016011600085858581811061190e5761190d613d7e565b5b90506020020160208101906119239190613130565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061197f90613dad565b9150506118ea565b505050565b61199461219a565b73ffffffffffffffffffffffffffffffffffffffff166119b26110c3565b73ffffffffffffffffffffffffffffffffffffffff1614611a08576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ff906135ea565b60405180910390fd5b6001601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600b5481565b600c5481565b611a7761219a565b73ffffffffffffffffffffffffffffffffffffffff16611a956110c3565b73ffffffffffffffffffffffffffffffffffffffff1614611aeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae2906135ea565b60405180910390fd5b80600e60016101000a81548160ff02191690831515021790555050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ba461219a565b73ffffffffffffffffffffffffffffffffffffffff16611bc26110c3565b73ffffffffffffffffffffffffffffffffffffffff1614611c18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0f906135ea565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7e90613e67565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600081611d4f611ed4565b11611db857600154821015611db75760005b6000600560008581526020019081526020016000205491508103611d905782611d8990613e87565b9250611d61565b60007c01000000000000000000000000000000000000000000000000000000008216149150505b5b919050565b8060005260046000fd5b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611ec1576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611e3e929190613eb0565b602060405180830381865afa158015611e5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e7f9190613eee565b611ec057806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611eb79190612fb2565b60405180910390fd5b5b50565b611ed082826001612629565b5050565b600090565b6000611ee4826121c2565b905073ffffffffffffffffffffffffffffffffffffffff8473ffffffffffffffffffffffffffffffffffffffff161693508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611f5957611f5863a114810060e01b611dbd565b5b600080611f6584612758565b91509150611f7b8187611f7661277f565b612787565b611fa657611f9086611f8b61277f565b611b08565b611fa557611fa46359c896be60e01b611dbd565b5b5b611fb386868660016127cb565b8015611fbe57600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061208c856120688888876127d1565b7c0200000000000000000000000000000000000000000000000000000000176127f9565b600560008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603612112576000600185019050600060056000838152602001908152602001600020540361211057600154811461210f578360056000838152602001908152602001600020819055505b5b505b600073ffffffffffffffffffffffffffffffffffffffff8673ffffffffffffffffffffffffffffffffffffffff161690508481887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600081036121845761218363ea553b3460e01b611dbd565b5b6121918787876001612824565b50505050505050565b600033905090565b6121bd838383604051806020016040528060008152506115b9565b505050565b6000816121cd611ed4565b1161229857600560008381526020019081526020016000205490506000810361226f57600154821061220a5761220963df2d9b4260e01b611dbd565b5b5b6005600083600190039350838152602001908152602001600020549050600081031561226a5760007c0100000000000000000000000000000000000000000000000000000000821603156122a95761226963df2d9b4260e01b611dbd565b5b61220b565b60007c0100000000000000000000000000000000000000000000000000000000821603156122a9575b6122a863df2d9b4260e01b611dbd565b5b919050565b6122c882826040518060200160405280600081525061282a565b5050565b80600860006122d961277f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661238661277f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123cb9190612e41565b60405180910390a35050565b6123e28160006128b0565b50565b6123f0848484610a67565b60008373ffffffffffffffffffffffffffffffffffffffff163b146124315761241b84848484612ae1565b6124305761242f63d1a57ed660e01b611dbd565b5b5b50505050565b6060600f80546124469061356d565b80601f01602080910402602001604051908101604052809291908181526020018280546124729061356d565b80156124bf5780601f10612494576101008083540402835291602001916124bf565b820191906000526020600020905b8154815290600101906020018083116124a257829003601f168201915b5050505050905090565b606060008203612510576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612624565b600082905060005b6000821461254257808061252b90613dad565b915050600a8261253b9190613f4a565b9150612518565b60008167ffffffffffffffff81111561255e5761255d6132ad565b5b6040519080825280601f01601f1916602001820160405280156125905781602001600182028036833780820191505090505b5090505b6000851461261d576001826125a99190613f7b565b9150600a856125b89190613faf565b60306125c491906139d4565b60f81b8183815181106125da576125d9613d7e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126169190613f4a565b9450612594565b8093505050505b919050565b600061263483610d5c565b905081801561267657508073ffffffffffffffffffffffffffffffffffffffff1661265d61277f565b73ffffffffffffffffffffffffffffffffffffffff1614155b156126a25761268c8161268761277f565b611b08565b6126a1576126a063cfb3b94260e01b611dbd565b5b5b836007600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86127e8868684612c10565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6128348383612c19565b60008373ffffffffffffffffffffffffffffffffffffffff163b146128ab5760006001549050600083820390505b6128756000868380600101945086612ae1565b61288a5761288963d1a57ed660e01b611dbd565b5b8181106128625781600154146128a8576128a7600060e01b611dbd565b5b50505b505050565b60006128bb836121c2565b905060008190506000806128ce86612758565b915091508415612916576128ea81846128e561277f565b612787565b612915576128ff836128fa61277f565b611b08565b612914576129136359c896be60e01b611dbd565b5b5b5b6129248360008860016127cb565b801561292f57600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506129d783612994856000886127d1565b7c02000000000000000000000000000000000000000000000000000000007c010000000000000000000000000000000000000000000000000000000017176127f9565b600560008881526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000851603612a5d5760006001870190506000600560008381526020019081526020016000205403612a5b576001548114612a5a578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ac7836000886001612824565b600260008154809291906001019190505550505050505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b0761277f565b8786866040518563ffffffff1660e01b8152600401612b299493929190614035565b6020604051808303816000875af1925050508015612b6557506040513d601f19601f82011682018060405250810190612b629190614096565b60015b612bbd573d8060008114612b95576040519150601f19603f3d011682016040523d82523d6000602084013e612b9a565b606091505b506000815103612bb557612bb463d1a57ed660e01b611dbd565b5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b6000600154905060008203612c3957612c3863b562e8dd60e01b611dbd565b5b612c4660008483856127cb565b612c6683612c5760008660006127d1565b612c6085612d7d565b176127f9565b6005600083815260200190815260200160002081905550600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550600073ffffffffffffffffffffffffffffffffffffffff8473ffffffffffffffffffffffffffffffffffffffff1616905060008103612d1e57612d1d632e07630060e01b611dbd565b5b6000838301905060008390505b808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4818160010191508103612d2b5781600181905550505050612d786000848385612824565b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612dd681612da1565b8114612de157600080fd5b50565b600081359050612df381612dcd565b92915050565b600060208284031215612e0f57612e0e612d97565b5b6000612e1d84828501612de4565b91505092915050565b60008115159050919050565b612e3b81612e26565b82525050565b6000602082019050612e566000830184612e32565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e96578082015181840152602081019050612e7b565b60008484015250505050565b6000601f19601f8301169050919050565b6000612ebe82612e5c565b612ec88185612e67565b9350612ed8818560208601612e78565b612ee181612ea2565b840191505092915050565b60006020820190508181036000830152612f068184612eb3565b905092915050565b6000819050919050565b612f2181612f0e565b8114612f2c57600080fd5b50565b600081359050612f3e81612f18565b92915050565b600060208284031215612f5a57612f59612d97565b5b6000612f6884828501612f2f565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612f9c82612f71565b9050919050565b612fac81612f91565b82525050565b6000602082019050612fc76000830184612fa3565b92915050565b612fd681612f91565b8114612fe157600080fd5b50565b600081359050612ff381612fcd565b92915050565b600080604083850312156130105761300f612d97565b5b600061301e85828601612fe4565b925050602061302f85828601612f2f565b9150509250929050565b61304281612f0e565b82525050565b600060208201905061305d6000830184613039565b92915050565b60008060006060848603121561307c5761307b612d97565b5b600061308a86828701612fe4565b935050602061309b86828701612fe4565b92505060406130ac86828701612f2f565b9150509250925092565b6000819050919050565b60006130db6130d66130d184612f71565b6130b6565b612f71565b9050919050565b60006130ed826130c0565b9050919050565b60006130ff826130e2565b9050919050565b61310f816130f4565b82525050565b600060208201905061312a6000830184613106565b92915050565b60006020828403121561314657613145612d97565b5b600061315484828501612fe4565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126131825761318161315d565b5b8235905067ffffffffffffffff81111561319f5761319e613162565b5b6020830191508360018202830111156131bb576131ba613167565b5b9250929050565b600080602083850312156131d9576131d8612d97565b5b600083013567ffffffffffffffff8111156131f7576131f6612d9c565b5b6132038582860161316c565b92509250509250929050565b61321881612e26565b811461322357600080fd5b50565b6000813590506132358161320f565b92915050565b6000806040838503121561325257613251612d97565b5b600061326085828601612fe4565b925050602061327185828601613226565b9150509250929050565b60006020828403121561329157613290612d97565b5b600061329f84828501613226565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6132e582612ea2565b810181811067ffffffffffffffff82111715613304576133036132ad565b5b80604052505050565b6000613317612d8d565b905061332382826132dc565b919050565b600067ffffffffffffffff821115613343576133426132ad565b5b61334c82612ea2565b9050602081019050919050565b82818337600083830152505050565b600061337b61337684613328565b61330d565b905082815260208101848484011115613397576133966132a8565b5b6133a2848285613359565b509392505050565b600082601f8301126133bf576133be61315d565b5b81356133cf848260208601613368565b91505092915050565b600080600080608085870312156133f2576133f1612d97565b5b600061340087828801612fe4565b945050602061341187828801612fe4565b935050604061342287828801612f2f565b925050606085013567ffffffffffffffff81111561344357613442612d9c565b5b61344f878288016133aa565b91505092959194509250565b60008083601f8401126134715761347061315d565b5b8235905067ffffffffffffffff81111561348e5761348d613162565b5b6020830191508360208202830111156134aa576134a9613167565b5b9250929050565b600080602083850312156134c8576134c7612d97565b5b600083013567ffffffffffffffff8111156134e6576134e5612d9c565b5b6134f28582860161345b565b92509250509250929050565b6000806040838503121561351557613514612d97565b5b600061352385828601612fe4565b925050602061353485828601612fe4565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061358557607f821691505b6020821081036135985761359761353e565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006135d4602083612e67565b91506135df8261359e565b602082019050919050565b60006020820190508181036000830152613603816135c7565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613640601f83612e67565b915061364b8261360a565b602082019050919050565b6000602082019050818103600083015261366f81613633565b9050919050565b600081905092915050565b50565b6000613691600083613676565b915061369c82613681565b600082019050919050565b60006136b282613684565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b60006136f2601083612e67565b91506136fd826136bc565b602082019050919050565b60006020820190508181036000830152613721816136e5565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026137957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613758565b61379f8683613758565b95508019841693508086168417925050509392505050565b60006137d26137cd6137c884612f0e565b6130b6565b612f0e565b9050919050565b6000819050919050565b6137ec836137b7565b6138006137f8826137d9565b848454613765565b825550505050565b600090565b613815613808565b6138208184846137e3565b505050565b5b818110156138445761383960008261380d565b600181019050613826565b5050565b601f8211156138895761385a81613733565b61386384613748565b81016020851015613872578190505b61388661387e85613748565b830182613825565b50505b505050565b600082821c905092915050565b60006138ac6000198460080261388e565b1980831691505092915050565b60006138c5838361389b565b9150826002028217905092915050565b6138df8383613728565b67ffffffffffffffff8111156138f8576138f76132ad565b5b613902825461356d565b61390d828285613848565b6000601f83116001811461393c576000841561392a578287013590505b61393485826138b9565b86555061399c565b601f19841661394a86613733565b60005b828110156139725784890135825560018201915060208501945060208101905061394d565b8683101561398f578489013561398b601f89168261389b565b8355505b6001600288020188555050505b50505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006139df82612f0e565b91506139ea83612f0e565b9250828201905080821115613a0257613a016139a5565b5b92915050565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b6000613a3e602083612e67565b9150613a4982613a08565b602082019050919050565b60006020820190508181036000830152613a6d81613a31565b9050919050565b7f596f7520617265206e6f74206f6e2077686974656c6973740000000000000000600082015250565b6000613aaa601883612e67565b9150613ab582613a74565b602082019050919050565b60006020820190508181036000830152613ad981613a9d565b9050919050565b7f4d696e74206e6f74206f70656e20666f72207075626c69630000000000000000600082015250565b6000613b16601883612e67565b9150613b2182613ae0565b602082019050919050565b60006020820190508181036000830152613b4581613b09565b9050919050565b7f416d6f756e742073686f756c64206e6f7420657863656564206d6178206d696e60008201527f74206e756d626572000000000000000000000000000000000000000000000000602082015250565b6000613ba8602883612e67565b9150613bb382613b4c565b604082019050919050565b60006020820190508181036000830152613bd781613b9b565b9050919050565b6000613be982612f0e565b9150613bf483612f0e565b9250828202613c0281612f0e565b91508282048414831517613c1957613c186139a5565b5b5092915050565b7f506c656173652073656e642074686520657861637420616d6f756e742e000000600082015250565b6000613c56601d83612e67565b9150613c6182613c20565b602082019050919050565b60006020820190508181036000830152613c8581613c49565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613ce8602f83612e67565b9150613cf382613c8c565b604082019050919050565b60006020820190508181036000830152613d1781613cdb565b9050919050565b600081905092915050565b6000613d3482612e5c565b613d3e8185613d1e565b9350613d4e818560208601612e78565b80840191505092915050565b6000613d668285613d29565b9150613d728284613d29565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613db882612f0e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613dea57613de96139a5565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613e51602683612e67565b9150613e5c82613df5565b604082019050919050565b60006020820190508181036000830152613e8081613e44565b9050919050565b6000613e9282612f0e565b915060008203613ea557613ea46139a5565b5b600182039050919050565b6000604082019050613ec56000830185612fa3565b613ed26020830184612fa3565b9392505050565b600081519050613ee88161320f565b92915050565b600060208284031215613f0457613f03612d97565b5b6000613f1284828501613ed9565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613f5582612f0e565b9150613f6083612f0e565b925082613f7057613f6f613f1b565b5b828204905092915050565b6000613f8682612f0e565b9150613f9183612f0e565b9250828203905081811115613fa957613fa86139a5565b5b92915050565b6000613fba82612f0e565b9150613fc583612f0e565b925082613fd557613fd4613f1b565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b600061400782613fe0565b6140118185613feb565b9350614021818560208601612e78565b61402a81612ea2565b840191505092915050565b600060808201905061404a6000830187612fa3565b6140576020830186612fa3565b6140646040830185613039565b81810360608301526140768184613ffc565b905095945050505050565b60008151905061409081612dcd565b92915050565b6000602082840312156140ac576140ab612d97565b5b60006140ba84828501614081565b9150509291505056fea26469706673582212204d8cfc43c992b18b3a8180c54c90a166ed6c81b31ca3f61a722a2967a12d3a6e64736f6c63430008120033697066733a2f2f6261666b726569623770367932676662346133663572326c7765616b78696334666f6f753571667464727132616a746b6a32663577706a61696165
Deployed Bytecode
0x6080604052600436106102305760003560e01c8063918b5be11161012e578063b8ca64e4116100ab578063d5abeb011161006f578063d5abeb01146107c1578063de7fcb1d146107ec578063e0a8085314610817578063e985e9c514610840578063f2fde38b1461087d57610230565b8063b8ca64e4146106e0578063c6f6f21614610709578063c87b56dd14610732578063ce5299ab1461076f578063cebc68a71461079857610230565b8063a22cb465116100f2578063a22cb4651461061e578063a45ba8e714610647578063a694fc3a14610672578063af947cec1461069b578063b88d4fde146106c457610230565b8063918b5be11461055a57806391b7f5ed1461058357806395d89b41146105ac578063a035b1fe146105d7578063a0712d681461060257610230565b806342842e0e116101bc5780636c0360eb116101805780636c0360eb1461049457806370a08231146104bf578063715018a6146104fc578063868ff4a2146105135780638da5cb5b1461052f57610230565b806342842e0e146103aa5780634813d8a6146103c6578063518302271461040357806355f804b31461042e5780636352211e1461045757610230565b80630bb12bb8116102035780630bb12bb8146102f657806318160ddd1461032157806323b872dd1461034c5780633ccfd60b1461036857806341f434341461037f57610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d578063095ea7b3146102da575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190612df9565b6108a6565b6040516102699190612e41565b60405180910390f35b34801561027e57600080fd5b50610287610938565b6040516102949190612eec565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190612f44565b6109ca565b6040516102d19190612fb2565b60405180910390f35b6102f460048036038101906102ef9190612ff9565b610a28565b005b34801561030257600080fd5b5061030b610a41565b6040516103189190612e41565b60405180910390f35b34801561032d57600080fd5b50610336610a54565b6040516103439190613048565b60405180910390f35b61036660048036038101906103619190613063565b610a67565b005b34801561037457600080fd5b5061037d610ab6565b005b34801561038b57600080fd5b50610394610c36565b6040516103a19190613115565b60405180910390f35b6103c460048036038101906103bf9190613063565b610c48565b005b3480156103d257600080fd5b506103ed60048036038101906103e89190613130565b610c97565b6040516103fa9190612e41565b60405180910390f35b34801561040f57600080fd5b50610418610cb7565b6040516104259190612e41565b60405180910390f35b34801561043a57600080fd5b50610455600480360381019061045091906131c2565b610cca565b005b34801561046357600080fd5b5061047e60048036038101906104799190612f44565b610d5c565b60405161048b9190612fb2565b60405180910390f35b3480156104a057600080fd5b506104a9610d6e565b6040516104b69190612eec565b60405180910390f35b3480156104cb57600080fd5b506104e660048036038101906104e19190613130565b610dfc565b6040516104f39190613048565b60405180910390f35b34801561050857600080fd5b50610511610e93565b005b61052d60048036038101906105289190612f44565b610fcd565b005b34801561053b57600080fd5b506105446110c3565b6040516105519190612fb2565b60405180910390f35b34801561056657600080fd5b50610581600480360381019061057c91906131c2565b6110ec565b005b34801561058f57600080fd5b506105aa60048036038101906105a59190612f44565b61117e565b005b3480156105b857600080fd5b506105c1611204565b6040516105ce9190612eec565b60405180910390f35b3480156105e357600080fd5b506105ec611296565b6040516105f99190613048565b60405180910390f35b61061c60048036038101906106179190612f44565b61129c565b005b34801561062a57600080fd5b506106456004803603810190610640919061323b565b6113f1565b005b34801561065357600080fd5b5061065c61140a565b6040516106699190612eec565b60405180910390f35b34801561067e57600080fd5b5061069960048036038101906106949190612f44565b611498565b005b3480156106a757600080fd5b506106c260048036038101906106bd919061327b565b611520565b005b6106de60048036038101906106d991906133d8565b6115b9565b005b3480156106ec57600080fd5b5061070760048036038101906107029190612f44565b61160a565b005b34801561071557600080fd5b50610730600480360381019061072b9190612f44565b611690565b005b34801561073e57600080fd5b5061075960048036038101906107549190612f44565b611716565b6040516107669190612eec565b60405180910390f35b34801561077b57600080fd5b50610796600480360381019061079191906134b1565b61186b565b005b3480156107a457600080fd5b506107bf60048036038101906107ba9190613130565b61198c565b005b3480156107cd57600080fd5b506107d6611a63565b6040516107e39190613048565b60405180910390f35b3480156107f857600080fd5b50610801611a69565b60405161080e9190613048565b60405180910390f35b34801561082357600080fd5b5061083e6004803603810190610839919061327b565b611a6f565b005b34801561084c57600080fd5b50610867600480360381019061086291906134fe565b611b08565b6040516108749190612e41565b60405180910390f35b34801561088957600080fd5b506108a4600480360381019061089f9190613130565b611b9c565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061090157506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109315750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600380546109479061356d565b80601f01602080910402602001604051908101604052809291908181526020018280546109739061356d565b80156109c05780601f10610995576101008083540402835291602001916109c0565b820191906000526020600020905b8154815290600101906020018083116109a357829003601f168201915b5050505050905090565b60006109d582611d44565b6109ea576109e963cf4700e460e01b611dbd565b5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b81610a3281611dc7565b610a3c8383611ec4565b505050565b600e60009054906101000a900460ff1681565b6000610a5e611ed4565b60015403905090565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610aa557610aa433611dc7565b5b610ab0848484611ed9565b50505050565b610abe61219a565b73ffffffffffffffffffffffffffffffffffffffff16610adc6110c3565b73ffffffffffffffffffffffffffffffffffffffff1614610b32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b29906135ea565b60405180910390fd5b6002600a5403610b77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6e90613656565b60405180910390fd5b6002600a8190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610ba5906136a7565b60006040518083038185875af1925050503d8060008114610be2576040519150601f19603f3d011682016040523d82523d6000602084013e610be7565b606091505b5050905080610c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2290613708565b60405180910390fd5b506001600a81905550565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c8657610c8533611dc7565b5b610c918484846121a2565b50505050565b60116020528060005260406000206000915054906101000a900460ff1681565b600e60019054906101000a900460ff1681565b610cd261219a565b73ffffffffffffffffffffffffffffffffffffffff16610cf06110c3565b73ffffffffffffffffffffffffffffffffffffffff1614610d46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3d906135ea565b60405180910390fd5b8181600f9182610d579291906138d5565b505050565b6000610d67826121c2565b9050919050565b600f8054610d7b9061356d565b80601f0160208091040260200160405190810160405280929190818152602001828054610da79061356d565b8015610df45780601f10610dc957610100808354040283529160200191610df4565b820191906000526020600020905b815481529060010190602001808311610dd757829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e4257610e41638f4eb60460e01b611dbd565b5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610e9b61219a565b73ffffffffffffffffffffffffffffffffffffffff16610eb96110c3565b73ffffffffffffffffffffffffffffffffffffffff1614610f0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f06906135ea565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000610fd7610a54565b9050600b548282610fe891906139d4565b1115611029576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102090613a54565b60405180910390fd5b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166110b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ac90613ac0565b60405180910390fd5b6110bf33836122ae565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6110f461219a565b73ffffffffffffffffffffffffffffffffffffffff166111126110c3565b73ffffffffffffffffffffffffffffffffffffffff1614611168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115f906135ea565b60405180910390fd5b8181601091826111799291906138d5565b505050565b61118661219a565b73ffffffffffffffffffffffffffffffffffffffff166111a46110c3565b73ffffffffffffffffffffffffffffffffffffffff16146111fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f1906135ea565b60405180910390fd5b80600d8190555050565b6060600480546112139061356d565b80601f016020809104026020016040519081016040528092919081815260200182805461123f9061356d565b801561128c5780601f106112615761010080835404028352916020019161128c565b820191906000526020600020905b81548152906001019060200180831161126f57829003601f168201915b5050505050905090565b600d5481565b60006112a6610a54565b905060001515600e60009054906101000a900460ff161515146112fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f590613b2c565b60405180910390fd5b600b54828261130d91906139d4565b111561134e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134590613a54565b60405180910390fd5b600c54821115611393576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138a90613bbe565b60405180910390fd5b81600d546113a19190613bde565b3410156113e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113da90613c6c565b60405180910390fd5b6113ed33836122ae565b5050565b816113fb81611dc7565b61140583836122cc565b505050565b601080546114179061356d565b80601f01602080910402602001604051908101604052809291908181526020018280546114439061356d565b80156114905780601f1061146557610100808354040283529160200191611490565b820191906000526020600020905b81548152906001019060200180831161147357829003601f168201915b505050505081565b6114a061219a565b73ffffffffffffffffffffffffffffffffffffffff166114be6110c3565b73ffffffffffffffffffffffffffffffffffffffff1614611514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150b906135ea565b60405180910390fd5b61151d816123d7565b50565b61152861219a565b73ffffffffffffffffffffffffffffffffffffffff166115466110c3565b73ffffffffffffffffffffffffffffffffffffffff161461159c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611593906135ea565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146115f7576115f633611dc7565b5b611603858585856123e5565b5050505050565b61161261219a565b73ffffffffffffffffffffffffffffffffffffffff166116306110c3565b73ffffffffffffffffffffffffffffffffffffffff1614611686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167d906135ea565b60405180910390fd5b80600b8190555050565b61169861219a565b73ffffffffffffffffffffffffffffffffffffffff166116b66110c3565b73ffffffffffffffffffffffffffffffffffffffff161461170c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611703906135ea565b60405180910390fd5b80600c8190555050565b606061172182611d44565b611760576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175790613cfe565b60405180910390fd5b60001515600e60019054906101000a900460ff1615150361180d57601080546117889061356d565b80601f01602080910402602001604051908101604052809291908181526020018280546117b49061356d565b80156118015780601f106117d657610100808354040283529160200191611801565b820191906000526020600020905b8154815290600101906020018083116117e457829003601f168201915b50505050509050611866565b6000611817612437565b905060008151116118375760405180602001604052806000815250611862565b80611841846124c9565b604051602001611852929190613d5a565b6040516020818303038152906040525b9150505b919050565b61187361219a565b73ffffffffffffffffffffffffffffffffffffffff166118916110c3565b73ffffffffffffffffffffffffffffffffffffffff16146118e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118de906135ea565b60405180910390fd5b60005b828290508110156119875760016011600085858581811061190e5761190d613d7e565b5b90506020020160208101906119239190613130565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061197f90613dad565b9150506118ea565b505050565b61199461219a565b73ffffffffffffffffffffffffffffffffffffffff166119b26110c3565b73ffffffffffffffffffffffffffffffffffffffff1614611a08576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ff906135ea565b60405180910390fd5b6001601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600b5481565b600c5481565b611a7761219a565b73ffffffffffffffffffffffffffffffffffffffff16611a956110c3565b73ffffffffffffffffffffffffffffffffffffffff1614611aeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae2906135ea565b60405180910390fd5b80600e60016101000a81548160ff02191690831515021790555050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ba461219a565b73ffffffffffffffffffffffffffffffffffffffff16611bc26110c3565b73ffffffffffffffffffffffffffffffffffffffff1614611c18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0f906135ea565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7e90613e67565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600081611d4f611ed4565b11611db857600154821015611db75760005b6000600560008581526020019081526020016000205491508103611d905782611d8990613e87565b9250611d61565b60007c01000000000000000000000000000000000000000000000000000000008216149150505b5b919050565b8060005260046000fd5b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611ec1576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611e3e929190613eb0565b602060405180830381865afa158015611e5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e7f9190613eee565b611ec057806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611eb79190612fb2565b60405180910390fd5b5b50565b611ed082826001612629565b5050565b600090565b6000611ee4826121c2565b905073ffffffffffffffffffffffffffffffffffffffff8473ffffffffffffffffffffffffffffffffffffffff161693508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611f5957611f5863a114810060e01b611dbd565b5b600080611f6584612758565b91509150611f7b8187611f7661277f565b612787565b611fa657611f9086611f8b61277f565b611b08565b611fa557611fa46359c896be60e01b611dbd565b5b5b611fb386868660016127cb565b8015611fbe57600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061208c856120688888876127d1565b7c0200000000000000000000000000000000000000000000000000000000176127f9565b600560008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603612112576000600185019050600060056000838152602001908152602001600020540361211057600154811461210f578360056000838152602001908152602001600020819055505b5b505b600073ffffffffffffffffffffffffffffffffffffffff8673ffffffffffffffffffffffffffffffffffffffff161690508481887fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600081036121845761218363ea553b3460e01b611dbd565b5b6121918787876001612824565b50505050505050565b600033905090565b6121bd838383604051806020016040528060008152506115b9565b505050565b6000816121cd611ed4565b1161229857600560008381526020019081526020016000205490506000810361226f57600154821061220a5761220963df2d9b4260e01b611dbd565b5b5b6005600083600190039350838152602001908152602001600020549050600081031561226a5760007c0100000000000000000000000000000000000000000000000000000000821603156122a95761226963df2d9b4260e01b611dbd565b5b61220b565b60007c0100000000000000000000000000000000000000000000000000000000821603156122a9575b6122a863df2d9b4260e01b611dbd565b5b919050565b6122c882826040518060200160405280600081525061282a565b5050565b80600860006122d961277f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661238661277f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123cb9190612e41565b60405180910390a35050565b6123e28160006128b0565b50565b6123f0848484610a67565b60008373ffffffffffffffffffffffffffffffffffffffff163b146124315761241b84848484612ae1565b6124305761242f63d1a57ed660e01b611dbd565b5b5b50505050565b6060600f80546124469061356d565b80601f01602080910402602001604051908101604052809291908181526020018280546124729061356d565b80156124bf5780601f10612494576101008083540402835291602001916124bf565b820191906000526020600020905b8154815290600101906020018083116124a257829003601f168201915b5050505050905090565b606060008203612510576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612624565b600082905060005b6000821461254257808061252b90613dad565b915050600a8261253b9190613f4a565b9150612518565b60008167ffffffffffffffff81111561255e5761255d6132ad565b5b6040519080825280601f01601f1916602001820160405280156125905781602001600182028036833780820191505090505b5090505b6000851461261d576001826125a99190613f7b565b9150600a856125b89190613faf565b60306125c491906139d4565b60f81b8183815181106125da576125d9613d7e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126169190613f4a565b9450612594565b8093505050505b919050565b600061263483610d5c565b905081801561267657508073ffffffffffffffffffffffffffffffffffffffff1661265d61277f565b73ffffffffffffffffffffffffffffffffffffffff1614155b156126a25761268c8161268761277f565b611b08565b6126a1576126a063cfb3b94260e01b611dbd565b5b5b836007600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86127e8868684612c10565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6128348383612c19565b60008373ffffffffffffffffffffffffffffffffffffffff163b146128ab5760006001549050600083820390505b6128756000868380600101945086612ae1565b61288a5761288963d1a57ed660e01b611dbd565b5b8181106128625781600154146128a8576128a7600060e01b611dbd565b5b50505b505050565b60006128bb836121c2565b905060008190506000806128ce86612758565b915091508415612916576128ea81846128e561277f565b612787565b612915576128ff836128fa61277f565b611b08565b612914576129136359c896be60e01b611dbd565b5b5b5b6129248360008860016127cb565b801561292f57600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506129d783612994856000886127d1565b7c02000000000000000000000000000000000000000000000000000000007c010000000000000000000000000000000000000000000000000000000017176127f9565b600560008881526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000851603612a5d5760006001870190506000600560008381526020019081526020016000205403612a5b576001548114612a5a578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ac7836000886001612824565b600260008154809291906001019190505550505050505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b0761277f565b8786866040518563ffffffff1660e01b8152600401612b299493929190614035565b6020604051808303816000875af1925050508015612b6557506040513d601f19601f82011682018060405250810190612b629190614096565b60015b612bbd573d8060008114612b95576040519150601f19603f3d011682016040523d82523d6000602084013e612b9a565b606091505b506000815103612bb557612bb463d1a57ed660e01b611dbd565b5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b6000600154905060008203612c3957612c3863b562e8dd60e01b611dbd565b5b612c4660008483856127cb565b612c6683612c5760008660006127d1565b612c6085612d7d565b176127f9565b6005600083815260200190815260200160002081905550600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550600073ffffffffffffffffffffffffffffffffffffffff8473ffffffffffffffffffffffffffffffffffffffff1616905060008103612d1e57612d1d632e07630060e01b611dbd565b5b6000838301905060008390505b808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4818160010191508103612d2b5781600181905550505050612d786000848385612824565b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612dd681612da1565b8114612de157600080fd5b50565b600081359050612df381612dcd565b92915050565b600060208284031215612e0f57612e0e612d97565b5b6000612e1d84828501612de4565b91505092915050565b60008115159050919050565b612e3b81612e26565b82525050565b6000602082019050612e566000830184612e32565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e96578082015181840152602081019050612e7b565b60008484015250505050565b6000601f19601f8301169050919050565b6000612ebe82612e5c565b612ec88185612e67565b9350612ed8818560208601612e78565b612ee181612ea2565b840191505092915050565b60006020820190508181036000830152612f068184612eb3565b905092915050565b6000819050919050565b612f2181612f0e565b8114612f2c57600080fd5b50565b600081359050612f3e81612f18565b92915050565b600060208284031215612f5a57612f59612d97565b5b6000612f6884828501612f2f565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612f9c82612f71565b9050919050565b612fac81612f91565b82525050565b6000602082019050612fc76000830184612fa3565b92915050565b612fd681612f91565b8114612fe157600080fd5b50565b600081359050612ff381612fcd565b92915050565b600080604083850312156130105761300f612d97565b5b600061301e85828601612fe4565b925050602061302f85828601612f2f565b9150509250929050565b61304281612f0e565b82525050565b600060208201905061305d6000830184613039565b92915050565b60008060006060848603121561307c5761307b612d97565b5b600061308a86828701612fe4565b935050602061309b86828701612fe4565b92505060406130ac86828701612f2f565b9150509250925092565b6000819050919050565b60006130db6130d66130d184612f71565b6130b6565b612f71565b9050919050565b60006130ed826130c0565b9050919050565b60006130ff826130e2565b9050919050565b61310f816130f4565b82525050565b600060208201905061312a6000830184613106565b92915050565b60006020828403121561314657613145612d97565b5b600061315484828501612fe4565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126131825761318161315d565b5b8235905067ffffffffffffffff81111561319f5761319e613162565b5b6020830191508360018202830111156131bb576131ba613167565b5b9250929050565b600080602083850312156131d9576131d8612d97565b5b600083013567ffffffffffffffff8111156131f7576131f6612d9c565b5b6132038582860161316c565b92509250509250929050565b61321881612e26565b811461322357600080fd5b50565b6000813590506132358161320f565b92915050565b6000806040838503121561325257613251612d97565b5b600061326085828601612fe4565b925050602061327185828601613226565b9150509250929050565b60006020828403121561329157613290612d97565b5b600061329f84828501613226565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6132e582612ea2565b810181811067ffffffffffffffff82111715613304576133036132ad565b5b80604052505050565b6000613317612d8d565b905061332382826132dc565b919050565b600067ffffffffffffffff821115613343576133426132ad565b5b61334c82612ea2565b9050602081019050919050565b82818337600083830152505050565b600061337b61337684613328565b61330d565b905082815260208101848484011115613397576133966132a8565b5b6133a2848285613359565b509392505050565b600082601f8301126133bf576133be61315d565b5b81356133cf848260208601613368565b91505092915050565b600080600080608085870312156133f2576133f1612d97565b5b600061340087828801612fe4565b945050602061341187828801612fe4565b935050604061342287828801612f2f565b925050606085013567ffffffffffffffff81111561344357613442612d9c565b5b61344f878288016133aa565b91505092959194509250565b60008083601f8401126134715761347061315d565b5b8235905067ffffffffffffffff81111561348e5761348d613162565b5b6020830191508360208202830111156134aa576134a9613167565b5b9250929050565b600080602083850312156134c8576134c7612d97565b5b600083013567ffffffffffffffff8111156134e6576134e5612d9c565b5b6134f28582860161345b565b92509250509250929050565b6000806040838503121561351557613514612d97565b5b600061352385828601612fe4565b925050602061353485828601612fe4565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061358557607f821691505b6020821081036135985761359761353e565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006135d4602083612e67565b91506135df8261359e565b602082019050919050565b60006020820190508181036000830152613603816135c7565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613640601f83612e67565b915061364b8261360a565b602082019050919050565b6000602082019050818103600083015261366f81613633565b9050919050565b600081905092915050565b50565b6000613691600083613676565b915061369c82613681565b600082019050919050565b60006136b282613684565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b60006136f2601083612e67565b91506136fd826136bc565b602082019050919050565b60006020820190508181036000830152613721816136e5565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026137957fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613758565b61379f8683613758565b95508019841693508086168417925050509392505050565b60006137d26137cd6137c884612f0e565b6130b6565b612f0e565b9050919050565b6000819050919050565b6137ec836137b7565b6138006137f8826137d9565b848454613765565b825550505050565b600090565b613815613808565b6138208184846137e3565b505050565b5b818110156138445761383960008261380d565b600181019050613826565b5050565b601f8211156138895761385a81613733565b61386384613748565b81016020851015613872578190505b61388661387e85613748565b830182613825565b50505b505050565b600082821c905092915050565b60006138ac6000198460080261388e565b1980831691505092915050565b60006138c5838361389b565b9150826002028217905092915050565b6138df8383613728565b67ffffffffffffffff8111156138f8576138f76132ad565b5b613902825461356d565b61390d828285613848565b6000601f83116001811461393c576000841561392a578287013590505b61393485826138b9565b86555061399c565b601f19841661394a86613733565b60005b828110156139725784890135825560018201915060208501945060208101905061394d565b8683101561398f578489013561398b601f89168261389b565b8355505b6001600288020188555050505b50505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006139df82612f0e565b91506139ea83612f0e565b9250828201905080821115613a0257613a016139a5565b5b92915050565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b6000613a3e602083612e67565b9150613a4982613a08565b602082019050919050565b60006020820190508181036000830152613a6d81613a31565b9050919050565b7f596f7520617265206e6f74206f6e2077686974656c6973740000000000000000600082015250565b6000613aaa601883612e67565b9150613ab582613a74565b602082019050919050565b60006020820190508181036000830152613ad981613a9d565b9050919050565b7f4d696e74206e6f74206f70656e20666f72207075626c69630000000000000000600082015250565b6000613b16601883612e67565b9150613b2182613ae0565b602082019050919050565b60006020820190508181036000830152613b4581613b09565b9050919050565b7f416d6f756e742073686f756c64206e6f7420657863656564206d6178206d696e60008201527f74206e756d626572000000000000000000000000000000000000000000000000602082015250565b6000613ba8602883612e67565b9150613bb382613b4c565b604082019050919050565b60006020820190508181036000830152613bd781613b9b565b9050919050565b6000613be982612f0e565b9150613bf483612f0e565b9250828202613c0281612f0e565b91508282048414831517613c1957613c186139a5565b5b5092915050565b7f506c656173652073656e642074686520657861637420616d6f756e742e000000600082015250565b6000613c56601d83612e67565b9150613c6182613c20565b602082019050919050565b60006020820190508181036000830152613c8581613c49565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613ce8602f83612e67565b9150613cf382613c8c565b604082019050919050565b60006020820190508181036000830152613d1781613cdb565b9050919050565b600081905092915050565b6000613d3482612e5c565b613d3e8185613d1e565b9350613d4e818560208601612e78565b80840191505092915050565b6000613d668285613d29565b9150613d728284613d29565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613db882612f0e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613dea57613de96139a5565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613e51602683612e67565b9150613e5c82613df5565b604082019050919050565b60006020820190508181036000830152613e8081613e44565b9050919050565b6000613e9282612f0e565b915060008203613ea557613ea46139a5565b5b600182039050919050565b6000604082019050613ec56000830185612fa3565b613ed26020830184612fa3565b9392505050565b600081519050613ee88161320f565b92915050565b600060208284031215613f0457613f03612d97565b5b6000613f1284828501613ed9565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613f5582612f0e565b9150613f6083612f0e565b925082613f7057613f6f613f1b565b5b828204905092915050565b6000613f8682612f0e565b9150613f9183612f0e565b9250828203905081811115613fa957613fa86139a5565b5b92915050565b6000613fba82612f0e565b9150613fc583612f0e565b925082613fd557613fd4613f1b565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b600061400782613fe0565b6140118185613feb565b9350614021818560208601612e78565b61402a81612ea2565b840191505092915050565b600060808201905061404a6000830187612fa3565b6140576020830186612fa3565b6140646040830185613039565b81810360608301526140768184613ffc565b905095945050505050565b60008151905061409081612dcd565b92915050565b6000602082840312156140ac576140ab612d97565b5b60006140ba84828501614081565b9150509291505056fea26469706673582212204d8cfc43c992b18b3a8180c54c90a166ed6c81b31ca3f61a722a2967a12d3a6e64736f6c63430008120033
Deployed Bytecode Sourcemap
74981:23018:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38249:655;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39167:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46496:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77774:190;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75215:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34814:308;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78657:205;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77388:186;;;;;;;;;;;;;:::i;:::-;;15997:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78181:213;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75436:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75253:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76737:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40632:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75288:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35983:258;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7344:148;;;;;;;;;;;;;:::i;:::-;;78894:314;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6693:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76510:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76187:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39343:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75169:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75587:488;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77972:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75316:111;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77582:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76083:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78402:247;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76281:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76392:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76959:421;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79342:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79220:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75094:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75131:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76642:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47508:189;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7647:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38249:655;38350:4;38689:10;38674:25;;:11;:25;;;;:102;;;;38766:10;38751:25;;:11;:25;;;;38674:102;:179;;;;38843:10;38828:25;;:11;:25;;;;38674:179;38654:199;;38249:655;;;:::o;39167:100::-;39221:13;39254:5;39247:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39167:100;:::o;46496:256::-;46588:7;46613:16;46621:7;46613;:16::i;:::-;46608:86;;46644:50;46652:41;;;46644:7;:50::i;:::-;46608:86;46714:15;:24;46730:7;46714:24;;;;;;;;;;;:30;;;;;;;;;;;;46707:37;;46496:256;;;:::o;77774:190::-;77903:8;17913:30;17934:8;17913:20;:30::i;:::-;77924:32:::1;77938:8;77948:7;77924:13;:32::i;:::-;77774:190:::0;;;:::o;75215:31::-;;;;;;;;;;;;;:::o;34814:308::-;34875:7;35088:15;:13;:15::i;:::-;35072:13;;:31;35065:38;;34814:308;:::o;78657:205::-;78800:4;17647:10;17639:18;;:4;:18;;;17635:83;;17674:32;17695:10;17674:20;:32::i;:::-;17635:83;78817:37:::1;78836:4;78842:2;78846:7;78817:18;:37::i;:::-;78657:205:::0;;;;:::o;77388:186::-;6924:12;:10;:12::i;:::-;6913:23;;:7;:5;:7::i;:::-;:23;;;6905:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3746:1:::1;4343:7;;:19:::0;4335:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3746:1;4476:7;:18;;;;77452:12:::2;77470:10;:15;;77493:21;77470:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77451:68;;;77538:7;77530:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;77440:134;3702:1:::1;4655:7;:22;;;;77388:186::o:0;15997:143::-;8014:42;15997:143;:::o;78181:213::-;78328:4;17647:10;17639:18;;:4;:18;;;17635:83;;17674:32;17695:10;17674:20;:32::i;:::-;17635:83;78345:41:::1;78368:4;78374:2;78378:7;78345:22;:41::i;:::-;78181:213:::0;;;;:::o;75436:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;75253:28::-;;;;;;;;;;;;;:::o;76737:106::-;6924:12;:10;:12::i;:::-;6913:23;;:7;:5;:7::i;:::-;:23;;;6905:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76825:10:::1;;76815:7;:20;;;;;;;:::i;:::-;;76737:106:::0;;:::o;40632:168::-;40720:7;40763:27;40782:7;40763:18;:27::i;:::-;40740:52;;40632:168;;;:::o;75288:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35983:258::-;36071:7;36112:1;36095:19;;:5;:19;;;36091:69;;36116:44;36124:35;;;36116:7;:44::i;:::-;36091:69;30094:13;36178:18;:25;36197:5;36178:25;;;;;;;;;;;;;;;;:55;36171:62;;35983:258;;;:::o;7344:148::-;6924:12;:10;:12::i;:::-;6913:23;;:7;:5;:7::i;:::-;:23;;;6905:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7451:1:::1;7414:40;;7435:6;::::0;::::1;;;;;;;;7414:40;;;;;;;;;;;;7482:1;7465:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;7344:148::o:0;78894:314::-;78963:10;78976:13;:11;:13::i;:::-;78963:26;;79027:9;;79017:6;79012:2;:11;;;;:::i;:::-;:24;;79004:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;79096:15;:27;79112:10;79096:27;;;;;;;;;;;;;;;;;;;;;;;;;79088:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;79167:29;79177:10;79189:6;79167:9;:29::i;:::-;78948:260;78894:314;:::o;6693:87::-;6739:7;6766:6;;;;;;;;;;;6759:13;;6693:87;:::o;76510:124::-;6924:12;:10;:12::i;:::-;6913:23;;:7;:5;:7::i;:::-;:23;;;6905:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76614:12:::1;;76594:17;:32;;;;;;;:::i;:::-;;76510:124:::0;;:::o;76187:86::-;6924:12;:10;:12::i;:::-;6913:23;;:7;:5;:7::i;:::-;:23;;;6905:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76259:6:::1;76251:5;:14;;;;76187:86:::0;:::o;39343:104::-;39399:13;39432:7;39425:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39343:104;:::o;75169:39::-;;;;:::o;75587:488::-;75645:10;75658:13;:11;:13::i;:::-;75645:26;;75706:5;75690:21;;:12;;;;;;;;;;;:21;;;75682:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;75774:9;;75764:6;75759:2;:11;;;;:::i;:::-;:24;;75751:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;75863:12;;75853:6;:22;;75831:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;75985:6;75977:5;;:14;;;;:::i;:::-;75964:9;:27;;75956:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;76038:29;76048:10;76060:6;76038:9;:29::i;:::-;75634:441;75587:488;:::o;77972:201::-;78101:8;17913:30;17934:8;17913:20;:30::i;:::-;78122:43:::1;78146:8;78156;78122:23;:43::i;:::-;77972:201:::0;;;:::o;75316:111::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;77582:84::-;6924:12;:10;:12::i;:::-;6913:23;;:7;:5;:7::i;:::-;:23;;;6905:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;77644:14:::1;77650:7;77644:5;:14::i;:::-;77582:84:::0;:::o;76083:96::-;6924:12;:10;:12::i;:::-;6913:23;;:7;:5;:7::i;:::-;:23;;;6905:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76165:6:::1;76150:12;;:21;;;;;;;;;;;;;;;;;;76083:96:::0;:::o;78402:247::-;78577:4;17647:10;17639:18;;:4;:18;;;17635:83;;17674:32;17695:10;17674:20;:32::i;:::-;17635:83;78594:47:::1;78617:4;78623:2;78627:7;78636:4;78594:22;:47::i;:::-;78402:247:::0;;;;;:::o;76281:103::-;6924:12;:10;:12::i;:::-;6913:23;;:7;:5;:7::i;:::-;:23;;;6905:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76366:10:::1;76354:9;:22;;;;76281:103:::0;:::o;76392:110::-;6924:12;:10;:12::i;:::-;6913:23;;:7;:5;:7::i;:::-;:23;;;6905:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76481:13:::1;76466:12;:28;;;;76392:110:::0;:::o;76959:421::-;77033:13;77067:17;77075:8;77067:7;:17::i;:::-;77059:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;77162:5;77150:17;;:8;;;;;;;;;;;:17;;;77146:50;;77177:17;77170:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77146:50;77206:28;77237:10;:8;:10::i;:::-;77206:41;;77296:1;77271:14;77265:28;:32;:107;;;;;;;;;;;;;;;;;77324:14;77340:26;77357:8;77340:16;:26::i;:::-;77307:60;;;;;;;;;:::i;:::-;;;;;;;;;;;;;77265:107;77258:114;;;76959:421;;;;:::o;79342:208::-;6924:12;:10;:12::i;:::-;6913:23;;:7;:5;:7::i;:::-;:23;;;6905:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;79427:6:::1;79422:117;79443:10;;:17;;79439:1;:21;79422:117;;;79519:4;79486:15;:30;79502:10;;79513:1;79502:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;79486:30;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;79462:3;;;;;:::i;:::-;;;;79422:117;;;;79342:208:::0;;:::o;79220:110::-;6924:12;:10;:12::i;:::-;6913:23;;:7;:5;:7::i;:::-;:23;;;6905:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;79314:4:::1;79286:15;:25;79302:8;79286:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;79220:110:::0;:::o;75094:30::-;;;;:::o;75131:31::-;;;;:::o;76642:87::-;6924:12;:10;:12::i;:::-;6913:23;;:7;:5;:7::i;:::-;:23;;;6905:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76715:6:::1;76704:8;;:17;;;;;;;;;;;;;;;;;;76642:87:::0;:::o;47508:189::-;47630:4;47654:18;:25;47673:5;47654:25;;;;;;;;;;;;;;;:35;47680:8;47654:35;;;;;;;;;;;;;;;;;;;;;;;;;47647:42;;47508:189;;;;:::o;7647:244::-;6924:12;:10;:12::i;:::-;6913:23;;:7;:5;:7::i;:::-;:23;;;6905:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7756:1:::1;7736:22;;:8;:22;;::::0;7728:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;7846:8;7817:38;;7838:6;::::0;::::1;;;;;;;;7817:38;;;;;;;;;;;;7875:8;7866:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;7647:244:::0;:::o;47955:384::-;48036:11;48083:7;48064:15;:13;:15::i;:::-;:26;48060:272;;48121:13;;48111:7;:23;48107:214;;;48155:14;48188:60;48236:1;48205:17;:26;48223:7;48205:26;;;;;;;;;;;;48196:35;;;48195:42;48188:60;;48239:9;;;;:::i;:::-;;;48188:60;;;48304:1;30870:8;48276:6;:24;:29;48267:38;;48136:185;48107:214;48060:272;47955:384;;;:::o;74746:165::-;74847:13;74841:4;74834:27;74888:4;74882;74875:18;18056:740;18295:1;8014:42;18247:45;;;:49;18243:546;;;8014:42;18564;;;18637:4;18665:8;18564:128;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18541:237;;18753:8;18734:28;;;;;;;;;;;:::i;:::-;;;;;;;;18541:237;18243:546;18056:740;:::o;46188:149::-;46302:27;46311:2;46315:7;46324:4;46302:8;:27::i;:::-;46188:149;;:::o;34330:92::-;34386:7;34330:92;:::o;50341:3701::-;50483:27;50513;50532:7;50513:18;:27::i;:::-;50483:57;;31552:14;50684:4;50668:22;;:41;50645:66;;50769:4;50728:45;;50744:19;50728:45;;;50724:108;;50788:44;50796:35;;;50788:7;:44::i;:::-;50724:108;50860:27;50902:23;50939:35;50966:7;50939:26;:35::i;:::-;50845:129;;;;51088:134;51131:15;51165:4;51188:19;:17;:19::i;:::-;51088:24;:134::i;:::-;51069:296;;51252:43;51269:4;51275:19;:17;:19::i;:::-;51252:16;:43::i;:::-;51247:118;;51314:51;51322:42;;;51314:7;:51::i;:::-;51247:118;51069:296;51378:43;51400:4;51406:2;51410:7;51419:1;51378:21;:43::i;:::-;51514:15;51511:160;;;51654:1;51633:19;51626:30;51511:160;52051:18;:24;52070:4;52051:24;;;;;;;;;;;;;;;;52049:26;;;;;;;;;;;;52120:18;:22;52139:2;52120:22;;;;;;;;;;;;;;;;52118:24;;;;;;;;;;;52442:167;52479:2;52549:45;52564:4;52570:2;52574:19;52549:14;:45::i;:::-;31150:8;52500:94;52442:18;:167::i;:::-;52413:17;:26;52431:7;52413:26;;;;;;;;;;;:196;;;;52780:1;31150:8;52729:19;:47;:52;52725:627;;52802:19;52834:1;52824:7;:11;52802:33;;52991:1;52957:17;:30;52975:11;52957:30;;;;;;;;;;;;:35;52953:384;;53095:13;;53080:11;:28;53076:242;;53275:19;53242:17;:30;53260:11;53242:30;;;;;;;;;;;:52;;;;53076:242;52953:384;52783:569;52725:627;53465:16;31552:14;53500:2;53484:20;;:39;53465:58;;53864:7;53828:8;53794:4;53736:25;53681:1;53624;53601:299;53937:1;53925:8;:13;53921:58;;53940:39;53948:30;;;53940:7;:39::i;:::-;53921:58;53992:42;54013:4;54019:2;54023:7;54032:1;53992:20;:42::i;:::-;50472:3570;;;;50341:3701;;;:::o;5284:98::-;5337:7;5364:10;5357:17;;5284:98;:::o;54138:193::-;54284:39;54301:4;54307:2;54311:7;54284:39;;;;;;;;;;;;:16;:39::i;:::-;54138:193;;;:::o;42176:2049::-;42259:14;42309:7;42290:15;:13;:15::i;:::-;:26;42286:1874;;42342:17;:26;42360:7;42342:26;;;;;;;;;;;;42333:35;;42478:1;42468:6;:11;42464:1313;;42515:13;;42504:7;:24;42500:98;;42551:47;42559:38;;;42551:7;:47::i;:::-;42500:98;43155:607;43233:17;:28;43251:9;;;;;;;43233:28;;;;;;;;;;;;43224:37;;43321:1;43311:6;:11;43307:25;43324:8;43307:25;43387:1;30870:8;43359:6;:24;:29;43355:48;43390:13;43355:48;43695:47;43703:38;;;43695:7;:47::i;:::-;43155:607;;;42464:1313;44132:1;30870:8;44104:6;:24;:29;44100:48;44135:13;44100:48;42286:1874;44170:47;44178:38;;;44170:7;:47::i;:::-;42176:2049;;;;:::o;65026:112::-;65103:27;65113:2;65117:8;65103:27;;;;;;;;;;;;:9;:27::i;:::-;65026:112;;:::o;47092:259::-;47264:8;47212:18;:39;47231:19;:17;:19::i;:::-;47212:39;;;;;;;;;;;;;;;:49;47252:8;47212:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;47324:8;47288:55;;47303:19;:17;:19::i;:::-;47288:55;;;47334:8;47288:55;;;;;;:::i;:::-;;;;;;;;47092:259;;:::o;66685:89::-;66745:21;66751:7;66760:5;66745;:21::i;:::-;66685:89;:::o;54929:416::-;55104:31;55117:4;55123:2;55127:7;55104:12;:31::i;:::-;55168:1;55150:2;:14;;;:19;55146:192;;55189:56;55220:4;55226:2;55230:7;55239:5;55189:30;:56::i;:::-;55184:154;;55266:56;55274:47;;;55266:7;:56::i;:::-;55184:154;55146:192;54929:416;;;;:::o;76851:100::-;76903:13;76936:7;76929:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76851:100;:::o;277:723::-;333:13;563:1;554:5;:10;550:53;;581:10;;;;;;;;;;;;;;;;;;;;;550:53;613:12;628:5;613:20;;644:14;669:78;684:1;676:4;:9;669:78;;702:8;;;;;:::i;:::-;;;;733:2;725:10;;;;;:::i;:::-;;;669:78;;;757:19;789:6;779:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;757:39;;807:154;823:1;814:5;:10;807:154;;851:1;841:11;;;;;:::i;:::-;;;918:2;910:5;:10;;;;:::i;:::-;897:2;:24;;;;:::i;:::-;884:39;;867:6;874;867:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;947:2;938:11;;;;;:::i;:::-;;;807:154;;;985:6;971:21;;;;;277:723;;;;:::o;65944:474::-;66073:13;66089:16;66097:7;66089;:16::i;:::-;66073:32;;66122:13;:45;;;;;66162:5;66139:28;;:19;:17;:19::i;:::-;:28;;;;66122:45;66118:201;;;66187:44;66204:5;66211:19;:17;:19::i;:::-;66187:16;:44::i;:::-;66182:137;;66252:51;66260:42;;;66252:7;:51::i;:::-;66182:137;66118:201;66364:2;66331:15;:24;66347:7;66331:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;66402:7;66398:2;66382:28;;66391:5;66382:28;;;;;;;;;;;;66062:356;65944:474;;;:::o;49220:501::-;49338:27;49367:23;49408:38;49449:15;:24;49465:7;49449:24;;;;;;;;;;;49408:65;;49626:18;49603:41;;49683:19;49677:26;49658:45;;49588:126;49220:501;;;:::o;72711:105::-;72771:7;72798:10;72791:17;;72711:105;:::o;48448:659::-;48597:11;48762:16;48755:5;48751:28;48742:37;;48922:16;48911:9;48907:32;48894:45;;49072:15;49061:9;49058:30;49050:5;49039:9;49036:20;49033:56;49023:66;;48448:659;;;;;:::o;56007:159::-;;;;;:::o;72020:311::-;72155:7;72175:16;31274:3;72201:19;:41;;72175:68;;31274:3;72269:31;72280:4;72286:2;72290:9;72269:10;:31::i;:::-;72261:40;;:62;;72254:69;;;72020:311;;;;;:::o;44789:524::-;44894:14;45062:16;45055:5;45051:28;45042:37;;45274:5;45260:11;45235:23;45231:41;45228:52;45204:5;45183:112;45173:122;;44789:524;;;;:::o;56831:158::-;;;;;:::o;63987:955::-;64118:19;64124:2;64128:8;64118:5;:19::i;:::-;64197:1;64179:2;:14;;;:19;64175:749;;64219:11;64233:13;;64219:27;;64265:13;64287:8;64281:3;:14;64265:30;;64314:489;64371:205;64440:1;64473:2;64506:7;;;;;;64544:5;64371:30;:205::i;:::-;64340:423;;64627:112;64665:47;;;64627:7;:112::i;:::-;64340:423;64798:3;64790:5;:11;64314:489;;64885:3;64868:13;;:20;64864:44;;64890:18;64905:1;64898:9;;64890:7;:18::i;:::-;64864:44;64200:724;;64175:749;63987:955;;;:::o;67003:3283::-;67083:27;67113;67132:7;67113:18;:27::i;:::-;67083:57;;67153:12;67184:19;67153:52;;67233:27;67275:23;67312:35;67339:7;67312:26;:35::i;:::-;67218:129;;;;67364:13;67360:460;;;67503:150;67550:15;67588:4;67615:19;:17;:19::i;:::-;67503:24;:150::i;:::-;67480:328;;67691:43;67708:4;67714:19;:17;:19::i;:::-;67691:16;:43::i;:::-;67686:122;;67757:51;67765:42;;;67757:7;:51::i;:::-;67686:122;67480:328;67360:460;67832:51;67854:4;67868:1;67872:7;67881:1;67832:21;:51::i;:::-;67976:15;67973:160;;;68116:1;68095:19;68088:30;67973:160;68794:1;30359:3;68764:1;:26;;68763:32;68735:18;:24;68754:4;68735:24;;;;;;;;;;;;;;;;:60;;;;;;;;;;;69062:197;69099:4;69191:53;69206:4;69220:1;69224:19;69191:14;:53::i;:::-;31150:8;30870;69123:43;69122:122;69062:18;:197::i;:::-;69033:17;:26;69051:7;69033:26;;;;;;;;;;;:226;;;;69430:1;31150:8;69379:19;:47;:52;69375:627;;69452:19;69484:1;69474:7;:11;69452:33;;69641:1;69607:17;:30;69625:11;69607:30;;;;;;;;;;;;:35;69603:384;;69745:13;;69730:11;:28;69726:242;;69925:19;69892:17;:30;69910:11;69892:30;;;;;;;;;;;:52;;;;69726:242;69603:384;69433:569;69375:627;70057:7;70053:1;70030:35;;70039:4;70030:35;;;;;;;;;;;;70076:50;70097:4;70111:1;70115:7;70124:1;70076:20;:50::i;:::-;70253:12;;:14;;;;;;;;;;;;;67072:3214;;;;67003:3283;;:::o;57429:806::-;57592:4;57651:2;57626:45;;;57690:19;:17;:19::i;:::-;57728:4;57751:7;57777:5;57626:171;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;57609:619;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58028:1;58011:6;:13;:18;58007:115;;58050:56;58058:47;;;58050:7;:56::i;:::-;58007:115;58194:6;58188:13;58179:6;58175:2;58171:15;58164:38;57609:619;57897:54;;;57870:81;;;:6;:81;;;;57846:105;;;57429:806;;;;;;:::o;71721:147::-;71858:6;71721:147;;;;;:::o;58697:2360::-;58770:20;58793:13;;58770:36;;58833:1;58821:8;:13;58817:53;;58836:34;58844:25;;;58836:7;:34::i;:::-;58817:53;58883:61;58913:1;58917:2;58921:12;58935:8;58883:21;:61::i;:::-;59417:160;59454:2;59529:33;59552:1;59556:2;59560:1;59529:14;:33::i;:::-;59475:30;59496:8;59475:20;:30::i;:::-;:87;59417:18;:160::i;:::-;59383:17;:31;59401:12;59383:31;;;;;;;;;;;:194;;;;59898:1;30232:2;59868:1;:26;;59867:32;59838:8;:62;59795:18;:22;59814:2;59795:22;;;;;;;;;;;;;;;;:105;;;;;;;;;;;60011:16;31552:14;60046:2;60030:20;;:39;60011:58;;60102:1;60090:8;:13;60086:54;;60105:35;60113:26;;;60105:7;:35::i;:::-;60086:54;60157:11;60186:8;60171:12;:23;60157:37;;60209:15;60227:12;60209:30;;60256:676;60675:7;60631:8;60586:1;60520:25;60457:1;60392;60361:358;60927:3;60914:9;;;;;;:16;60256:676;;60964:3;60948:13;:19;;;;59132:1847;;;60989:60;61018:1;61022:2;61026:12;61040:8;60989:20;:60::i;:::-;58759:2298;58697:2360;;:::o;45415:340::-;45501:14;45734:1;45724:8;45721:15;45695:24;45691:46;45681:56;;45415:340;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:60::-;5895:3;5916:5;5909:12;;5867:60;;;:::o;5933:142::-;5983:9;6016:53;6034:34;6043:24;6061:5;6043:24;:::i;:::-;6034:34;:::i;:::-;6016:53;:::i;:::-;6003:66;;5933:142;;;:::o;6081:126::-;6131:9;6164:37;6195:5;6164:37;:::i;:::-;6151:50;;6081:126;;;:::o;6213:157::-;6294:9;6327:37;6358:5;6327:37;:::i;:::-;6314:50;;6213:157;;;:::o;6376:193::-;6494:68;6556:5;6494:68;:::i;:::-;6489:3;6482:81;6376:193;;:::o;6575:284::-;6699:4;6737:2;6726:9;6722:18;6714:26;;6750:102;6849:1;6838:9;6834:17;6825:6;6750:102;:::i;:::-;6575:284;;;;:::o;6865:329::-;6924:6;6973:2;6961:9;6952:7;6948:23;6944:32;6941:119;;;6979:79;;:::i;:::-;6941:119;7099:1;7124:53;7169:7;7160:6;7149:9;7145:22;7124:53;:::i;:::-;7114:63;;7070:117;6865:329;;;;:::o;7200:117::-;7309:1;7306;7299:12;7323:117;7432:1;7429;7422:12;7446:117;7555:1;7552;7545:12;7583:553;7641:8;7651:6;7701:3;7694:4;7686:6;7682:17;7678:27;7668:122;;7709:79;;:::i;:::-;7668:122;7822:6;7809:20;7799:30;;7852:18;7844:6;7841:30;7838:117;;;7874:79;;:::i;:::-;7838:117;7988:4;7980:6;7976:17;7964:29;;8042:3;8034:4;8026:6;8022:17;8012:8;8008:32;8005:41;8002:128;;;8049:79;;:::i;:::-;8002:128;7583:553;;;;;:::o;8142:529::-;8213:6;8221;8270:2;8258:9;8249:7;8245:23;8241:32;8238:119;;;8276:79;;:::i;:::-;8238:119;8424:1;8413:9;8409:17;8396:31;8454:18;8446:6;8443:30;8440:117;;;8476:79;;:::i;:::-;8440:117;8589:65;8646:7;8637:6;8626:9;8622:22;8589:65;:::i;:::-;8571:83;;;;8367:297;8142:529;;;;;:::o;8677:116::-;8747:21;8762:5;8747:21;:::i;:::-;8740:5;8737:32;8727:60;;8783:1;8780;8773:12;8727:60;8677:116;:::o;8799:133::-;8842:5;8880:6;8867:20;8858:29;;8896:30;8920:5;8896:30;:::i;:::-;8799:133;;;;:::o;8938:468::-;9003:6;9011;9060:2;9048:9;9039:7;9035:23;9031:32;9028:119;;;9066:79;;:::i;:::-;9028:119;9186:1;9211:53;9256:7;9247:6;9236:9;9232:22;9211:53;:::i;:::-;9201:63;;9157:117;9313:2;9339:50;9381:7;9372:6;9361:9;9357:22;9339:50;:::i;:::-;9329:60;;9284:115;8938:468;;;;;:::o;9412:323::-;9468:6;9517:2;9505:9;9496:7;9492:23;9488:32;9485:119;;;9523:79;;:::i;:::-;9485:119;9643:1;9668:50;9710:7;9701:6;9690:9;9686:22;9668:50;:::i;:::-;9658:60;;9614:114;9412:323;;;;:::o;9741:117::-;9850:1;9847;9840:12;9864:180;9912:77;9909:1;9902:88;10009:4;10006:1;9999:15;10033:4;10030:1;10023:15;10050:281;10133:27;10155:4;10133:27;:::i;:::-;10125:6;10121:40;10263:6;10251:10;10248:22;10227:18;10215:10;10212:34;10209:62;10206:88;;;10274:18;;:::i;:::-;10206:88;10314:10;10310:2;10303:22;10093:238;10050:281;;:::o;10337:129::-;10371:6;10398:20;;:::i;:::-;10388:30;;10427:33;10455:4;10447:6;10427:33;:::i;:::-;10337:129;;;:::o;10472:307::-;10533:4;10623:18;10615:6;10612:30;10609:56;;;10645:18;;:::i;:::-;10609:56;10683:29;10705:6;10683:29;:::i;:::-;10675:37;;10767:4;10761;10757:15;10749:23;;10472:307;;;:::o;10785:146::-;10882:6;10877:3;10872;10859:30;10923:1;10914:6;10909:3;10905:16;10898:27;10785:146;;;:::o;10937:423::-;11014:5;11039:65;11055:48;11096:6;11055:48;:::i;:::-;11039:65;:::i;:::-;11030:74;;11127:6;11120:5;11113:21;11165:4;11158:5;11154:16;11203:3;11194:6;11189:3;11185:16;11182:25;11179:112;;;11210:79;;:::i;:::-;11179:112;11300:54;11347:6;11342:3;11337;11300:54;:::i;:::-;11020:340;10937:423;;;;;:::o;11379:338::-;11434:5;11483:3;11476:4;11468:6;11464:17;11460:27;11450:122;;11491:79;;:::i;:::-;11450:122;11608:6;11595:20;11633:78;11707:3;11699:6;11692:4;11684:6;11680:17;11633:78;:::i;:::-;11624:87;;11440:277;11379:338;;;;:::o;11723:943::-;11818:6;11826;11834;11842;11891:3;11879:9;11870:7;11866:23;11862:33;11859:120;;;11898:79;;:::i;:::-;11859:120;12018:1;12043:53;12088:7;12079:6;12068:9;12064:22;12043:53;:::i;:::-;12033:63;;11989:117;12145:2;12171:53;12216:7;12207:6;12196:9;12192:22;12171:53;:::i;:::-;12161:63;;12116:118;12273:2;12299:53;12344:7;12335:6;12324:9;12320:22;12299:53;:::i;:::-;12289:63;;12244:118;12429:2;12418:9;12414:18;12401:32;12460:18;12452:6;12449:30;12446:117;;;12482:79;;:::i;:::-;12446:117;12587:62;12641:7;12632:6;12621:9;12617:22;12587:62;:::i;:::-;12577:72;;12372:287;11723:943;;;;;;;:::o;12689:568::-;12762:8;12772:6;12822:3;12815:4;12807:6;12803:17;12799:27;12789:122;;12830:79;;:::i;:::-;12789:122;12943:6;12930:20;12920:30;;12973:18;12965:6;12962:30;12959:117;;;12995:79;;:::i;:::-;12959:117;13109:4;13101:6;13097:17;13085:29;;13163:3;13155:4;13147:6;13143:17;13133:8;13129:32;13126:41;13123:128;;;13170:79;;:::i;:::-;13123:128;12689:568;;;;;:::o;13263:559::-;13349:6;13357;13406:2;13394:9;13385:7;13381:23;13377:32;13374:119;;;13412:79;;:::i;:::-;13374:119;13560:1;13549:9;13545:17;13532:31;13590:18;13582:6;13579:30;13576:117;;;13612:79;;:::i;:::-;13576:117;13725:80;13797:7;13788:6;13777:9;13773:22;13725:80;:::i;:::-;13707:98;;;;13503:312;13263:559;;;;;:::o;13828:474::-;13896:6;13904;13953:2;13941:9;13932:7;13928:23;13924:32;13921:119;;;13959:79;;:::i;:::-;13921:119;14079:1;14104:53;14149:7;14140:6;14129:9;14125:22;14104:53;:::i;:::-;14094:63;;14050:117;14206:2;14232:53;14277:7;14268:6;14257:9;14253:22;14232:53;:::i;:::-;14222:63;;14177:118;13828:474;;;;;:::o;14308:180::-;14356:77;14353:1;14346:88;14453:4;14450:1;14443:15;14477:4;14474:1;14467:15;14494:320;14538:6;14575:1;14569:4;14565:12;14555:22;;14622:1;14616:4;14612:12;14643:18;14633:81;;14699:4;14691:6;14687:17;14677:27;;14633:81;14761:2;14753:6;14750:14;14730:18;14727:38;14724:84;;14780:18;;:::i;:::-;14724:84;14545:269;14494:320;;;:::o;14820:182::-;14960:34;14956:1;14948:6;14944:14;14937:58;14820:182;:::o;15008:366::-;15150:3;15171:67;15235:2;15230:3;15171:67;:::i;:::-;15164:74;;15247:93;15336:3;15247:93;:::i;:::-;15365:2;15360:3;15356:12;15349:19;;15008:366;;;:::o;15380:419::-;15546:4;15584:2;15573:9;15569:18;15561:26;;15633:9;15627:4;15623:20;15619:1;15608:9;15604:17;15597:47;15661:131;15787:4;15661:131;:::i;:::-;15653:139;;15380:419;;;:::o;15805:181::-;15945:33;15941:1;15933:6;15929:14;15922:57;15805:181;:::o;15992:366::-;16134:3;16155:67;16219:2;16214:3;16155:67;:::i;:::-;16148:74;;16231:93;16320:3;16231:93;:::i;:::-;16349:2;16344:3;16340:12;16333:19;;15992:366;;;:::o;16364:419::-;16530:4;16568:2;16557:9;16553:18;16545:26;;16617:9;16611:4;16607:20;16603:1;16592:9;16588:17;16581:47;16645:131;16771:4;16645:131;:::i;:::-;16637:139;;16364:419;;;:::o;16789:147::-;16890:11;16927:3;16912:18;;16789:147;;;;:::o;16942:114::-;;:::o;17062:398::-;17221:3;17242:83;17323:1;17318:3;17242:83;:::i;:::-;17235:90;;17334:93;17423:3;17334:93;:::i;:::-;17452:1;17447:3;17443:11;17436:18;;17062:398;;;:::o;17466:379::-;17650:3;17672:147;17815:3;17672:147;:::i;:::-;17665:154;;17836:3;17829:10;;17466:379;;;:::o;17851:166::-;17991:18;17987:1;17979:6;17975:14;17968:42;17851:166;:::o;18023:366::-;18165:3;18186:67;18250:2;18245:3;18186:67;:::i;:::-;18179:74;;18262:93;18351:3;18262:93;:::i;:::-;18380:2;18375:3;18371:12;18364:19;;18023:366;;;:::o;18395:419::-;18561:4;18599:2;18588:9;18584:18;18576:26;;18648:9;18642:4;18638:20;18634:1;18623:9;18619:17;18612:47;18676:131;18802:4;18676:131;:::i;:::-;18668:139;;18395:419;;;:::o;18820:97::-;18879:6;18907:3;18897:13;;18820:97;;;;:::o;18923:141::-;18972:4;18995:3;18987:11;;19018:3;19015:1;19008:14;19052:4;19049:1;19039:18;19031:26;;18923:141;;;:::o;19070:93::-;19107:6;19154:2;19149;19142:5;19138:14;19134:23;19124:33;;19070:93;;;:::o;19169:107::-;19213:8;19263:5;19257:4;19253:16;19232:37;;19169:107;;;;:::o;19282:393::-;19351:6;19401:1;19389:10;19385:18;19424:97;19454:66;19443:9;19424:97;:::i;:::-;19542:39;19572:8;19561:9;19542:39;:::i;:::-;19530:51;;19614:4;19610:9;19603:5;19599:21;19590:30;;19663:4;19653:8;19649:19;19642:5;19639:30;19629:40;;19358:317;;19282:393;;;;;:::o;19681:142::-;19731:9;19764:53;19782:34;19791:24;19809:5;19791:24;:::i;:::-;19782:34;:::i;:::-;19764:53;:::i;:::-;19751:66;;19681:142;;;:::o;19829:75::-;19872:3;19893:5;19886:12;;19829:75;;;:::o;19910:269::-;20020:39;20051:7;20020:39;:::i;:::-;20081:91;20130:41;20154:16;20130:41;:::i;:::-;20122:6;20115:4;20109:11;20081:91;:::i;:::-;20075:4;20068:105;19986:193;19910:269;;;:::o;20185:73::-;20230:3;20185:73;:::o;20264:189::-;20341:32;;:::i;:::-;20382:65;20440:6;20432;20426:4;20382:65;:::i;:::-;20317:136;20264:189;;:::o;20459:186::-;20519:120;20536:3;20529:5;20526:14;20519:120;;;20590:39;20627:1;20620:5;20590:39;:::i;:::-;20563:1;20556:5;20552:13;20543:22;;20519:120;;;20459:186;;:::o;20651:543::-;20752:2;20747:3;20744:11;20741:446;;;20786:38;20818:5;20786:38;:::i;:::-;20870:29;20888:10;20870:29;:::i;:::-;20860:8;20856:44;21053:2;21041:10;21038:18;21035:49;;;21074:8;21059:23;;21035:49;21097:80;21153:22;21171:3;21153:22;:::i;:::-;21143:8;21139:37;21126:11;21097:80;:::i;:::-;20756:431;;20741:446;20651:543;;;:::o;21200:117::-;21254:8;21304:5;21298:4;21294:16;21273:37;;21200:117;;;;:::o;21323:169::-;21367:6;21400:51;21448:1;21444:6;21436:5;21433:1;21429:13;21400:51;:::i;:::-;21396:56;21481:4;21475;21471:15;21461:25;;21374:118;21323:169;;;;:::o;21497:295::-;21573:4;21719:29;21744:3;21738:4;21719:29;:::i;:::-;21711:37;;21781:3;21778:1;21774:11;21768:4;21765:21;21757:29;;21497:295;;;;:::o;21797:1403::-;21921:44;21961:3;21956;21921:44;:::i;:::-;22030:18;22022:6;22019:30;22016:56;;;22052:18;;:::i;:::-;22016:56;22096:38;22128:4;22122:11;22096:38;:::i;:::-;22181:67;22241:6;22233;22227:4;22181:67;:::i;:::-;22275:1;22304:2;22296:6;22293:14;22321:1;22316:632;;;;22992:1;23009:6;23006:84;;;23065:9;23060:3;23056:19;23043:33;23034:42;;23006:84;23116:67;23176:6;23169:5;23116:67;:::i;:::-;23110:4;23103:81;22965:229;22286:908;;22316:632;22368:4;22364:9;22356:6;22352:22;22402:37;22434:4;22402:37;:::i;:::-;22461:1;22475:215;22489:7;22486:1;22483:14;22475:215;;;22575:9;22570:3;22566:19;22553:33;22545:6;22538:49;22626:1;22618:6;22614:14;22604:24;;22673:2;22662:9;22658:18;22645:31;;22512:4;22509:1;22505:12;22500:17;;22475:215;;;22718:6;22709:7;22706:19;22703:186;;;22783:9;22778:3;22774:19;22761:33;22826:48;22868:4;22860:6;22856:17;22845:9;22826:48;:::i;:::-;22818:6;22811:64;22726:163;22703:186;22935:1;22931;22923:6;22919:14;22915:22;22909:4;22902:36;22323:625;;;22286:908;;21896:1304;;;21797:1403;;;:::o;23206:180::-;23254:77;23251:1;23244:88;23351:4;23348:1;23341:15;23375:4;23372:1;23365:15;23392:191;23432:3;23451:20;23469:1;23451:20;:::i;:::-;23446:25;;23485:20;23503:1;23485:20;:::i;:::-;23480:25;;23528:1;23525;23521:9;23514:16;;23549:3;23546:1;23543:10;23540:36;;;23556:18;;:::i;:::-;23540:36;23392:191;;;;:::o;23589:182::-;23729:34;23725:1;23717:6;23713:14;23706:58;23589:182;:::o;23777:366::-;23919:3;23940:67;24004:2;23999:3;23940:67;:::i;:::-;23933:74;;24016:93;24105:3;24016:93;:::i;:::-;24134:2;24129:3;24125:12;24118:19;;23777:366;;;:::o;24149:419::-;24315:4;24353:2;24342:9;24338:18;24330:26;;24402:9;24396:4;24392:20;24388:1;24377:9;24373:17;24366:47;24430:131;24556:4;24430:131;:::i;:::-;24422:139;;24149:419;;;:::o;24574:174::-;24714:26;24710:1;24702:6;24698:14;24691:50;24574:174;:::o;24754:366::-;24896:3;24917:67;24981:2;24976:3;24917:67;:::i;:::-;24910:74;;24993:93;25082:3;24993:93;:::i;:::-;25111:2;25106:3;25102:12;25095:19;;24754:366;;;:::o;25126:419::-;25292:4;25330:2;25319:9;25315:18;25307:26;;25379:9;25373:4;25369:20;25365:1;25354:9;25350:17;25343:47;25407:131;25533:4;25407:131;:::i;:::-;25399:139;;25126:419;;;:::o;25551:174::-;25691:26;25687:1;25679:6;25675:14;25668:50;25551:174;:::o;25731:366::-;25873:3;25894:67;25958:2;25953:3;25894:67;:::i;:::-;25887:74;;25970:93;26059:3;25970:93;:::i;:::-;26088:2;26083:3;26079:12;26072:19;;25731:366;;;:::o;26103:419::-;26269:4;26307:2;26296:9;26292:18;26284:26;;26356:9;26350:4;26346:20;26342:1;26331:9;26327:17;26320:47;26384:131;26510:4;26384:131;:::i;:::-;26376:139;;26103:419;;;:::o;26528:227::-;26668:34;26664:1;26656:6;26652:14;26645:58;26737:10;26732:2;26724:6;26720:15;26713:35;26528:227;:::o;26761:366::-;26903:3;26924:67;26988:2;26983:3;26924:67;:::i;:::-;26917:74;;27000:93;27089:3;27000:93;:::i;:::-;27118:2;27113:3;27109:12;27102:19;;26761:366;;;:::o;27133:419::-;27299:4;27337:2;27326:9;27322:18;27314:26;;27386:9;27380:4;27376:20;27372:1;27361:9;27357:17;27350:47;27414:131;27540:4;27414:131;:::i;:::-;27406:139;;27133:419;;;:::o;27558:410::-;27598:7;27621:20;27639:1;27621:20;:::i;:::-;27616:25;;27655:20;27673:1;27655:20;:::i;:::-;27650:25;;27710:1;27707;27703:9;27732:30;27750:11;27732:30;:::i;:::-;27721:41;;27911:1;27902:7;27898:15;27895:1;27892:22;27872:1;27865:9;27845:83;27822:139;;27941:18;;:::i;:::-;27822:139;27606:362;27558:410;;;;:::o;27974:179::-;28114:31;28110:1;28102:6;28098:14;28091:55;27974:179;:::o;28159:366::-;28301:3;28322:67;28386:2;28381:3;28322:67;:::i;:::-;28315:74;;28398:93;28487:3;28398:93;:::i;:::-;28516:2;28511:3;28507:12;28500:19;;28159:366;;;:::o;28531:419::-;28697:4;28735:2;28724:9;28720:18;28712:26;;28784:9;28778:4;28774:20;28770:1;28759:9;28755:17;28748:47;28812:131;28938:4;28812:131;:::i;:::-;28804:139;;28531:419;;;:::o;28956:234::-;29096:34;29092:1;29084:6;29080:14;29073:58;29165:17;29160:2;29152:6;29148:15;29141:42;28956:234;:::o;29196:366::-;29338:3;29359:67;29423:2;29418:3;29359:67;:::i;:::-;29352:74;;29435:93;29524:3;29435:93;:::i;:::-;29553:2;29548:3;29544:12;29537:19;;29196:366;;;:::o;29568:419::-;29734:4;29772:2;29761:9;29757:18;29749:26;;29821:9;29815:4;29811:20;29807:1;29796:9;29792:17;29785:47;29849:131;29975:4;29849:131;:::i;:::-;29841:139;;29568:419;;;:::o;29993:148::-;30095:11;30132:3;30117:18;;29993:148;;;;:::o;30147:390::-;30253:3;30281:39;30314:5;30281:39;:::i;:::-;30336:89;30418:6;30413:3;30336:89;:::i;:::-;30329:96;;30434:65;30492:6;30487:3;30480:4;30473:5;30469:16;30434:65;:::i;:::-;30524:6;30519:3;30515:16;30508:23;;30257:280;30147:390;;;;:::o;30543:435::-;30723:3;30745:95;30836:3;30827:6;30745:95;:::i;:::-;30738:102;;30857:95;30948:3;30939:6;30857:95;:::i;:::-;30850:102;;30969:3;30962:10;;30543:435;;;;;:::o;30984:180::-;31032:77;31029:1;31022:88;31129:4;31126:1;31119:15;31153:4;31150:1;31143:15;31170:233;31209:3;31232:24;31250:5;31232:24;:::i;:::-;31223:33;;31278:66;31271:5;31268:77;31265:103;;31348:18;;:::i;:::-;31265:103;31395:1;31388:5;31384:13;31377:20;;31170:233;;;:::o;31409:225::-;31549:34;31545:1;31537:6;31533:14;31526:58;31618:8;31613:2;31605:6;31601:15;31594:33;31409:225;:::o;31640:366::-;31782:3;31803:67;31867:2;31862:3;31803:67;:::i;:::-;31796:74;;31879:93;31968:3;31879:93;:::i;:::-;31997:2;31992:3;31988:12;31981:19;;31640:366;;;:::o;32012:419::-;32178:4;32216:2;32205:9;32201:18;32193:26;;32265:9;32259:4;32255:20;32251:1;32240:9;32236:17;32229:47;32293:131;32419:4;32293:131;:::i;:::-;32285:139;;32012:419;;;:::o;32437:171::-;32476:3;32499:24;32517:5;32499:24;:::i;:::-;32490:33;;32545:4;32538:5;32535:15;32532:41;;32553:18;;:::i;:::-;32532:41;32600:1;32593:5;32589:13;32582:20;;32437:171;;;:::o;32614:332::-;32735:4;32773:2;32762:9;32758:18;32750:26;;32786:71;32854:1;32843:9;32839:17;32830:6;32786:71;:::i;:::-;32867:72;32935:2;32924:9;32920:18;32911:6;32867:72;:::i;:::-;32614:332;;;;;:::o;32952:137::-;33006:5;33037:6;33031:13;33022:22;;33053:30;33077:5;33053:30;:::i;:::-;32952:137;;;;:::o;33095:345::-;33162:6;33211:2;33199:9;33190:7;33186:23;33182:32;33179:119;;;33217:79;;:::i;:::-;33179:119;33337:1;33362:61;33415:7;33406:6;33395:9;33391:22;33362:61;:::i;:::-;33352:71;;33308:125;33095:345;;;;:::o;33446:180::-;33494:77;33491:1;33484:88;33591:4;33588:1;33581:15;33615:4;33612:1;33605:15;33632:185;33672:1;33689:20;33707:1;33689:20;:::i;:::-;33684:25;;33723:20;33741:1;33723:20;:::i;:::-;33718:25;;33762:1;33752:35;;33767:18;;:::i;:::-;33752:35;33809:1;33806;33802:9;33797:14;;33632:185;;;;:::o;33823:194::-;33863:4;33883:20;33901:1;33883:20;:::i;:::-;33878:25;;33917:20;33935:1;33917:20;:::i;:::-;33912:25;;33961:1;33958;33954:9;33946:17;;33985:1;33979:4;33976:11;33973:37;;;33990:18;;:::i;:::-;33973:37;33823:194;;;;:::o;34023:176::-;34055:1;34072:20;34090:1;34072:20;:::i;:::-;34067:25;;34106:20;34124:1;34106:20;:::i;:::-;34101:25;;34145:1;34135:35;;34150:18;;:::i;:::-;34135:35;34191:1;34188;34184:9;34179:14;;34023:176;;;;:::o;34205:98::-;34256:6;34290:5;34284:12;34274:22;;34205:98;;;:::o;34309:168::-;34392:11;34426:6;34421:3;34414:19;34466:4;34461:3;34457:14;34442:29;;34309:168;;;;:::o;34483:373::-;34569:3;34597:38;34629:5;34597:38;:::i;:::-;34651:70;34714:6;34709:3;34651:70;:::i;:::-;34644:77;;34730:65;34788:6;34783:3;34776:4;34769:5;34765:16;34730:65;:::i;:::-;34820:29;34842:6;34820:29;:::i;:::-;34815:3;34811:39;34804:46;;34573:283;34483:373;;;;:::o;34862:640::-;35057:4;35095:3;35084:9;35080:19;35072:27;;35109:71;35177:1;35166:9;35162:17;35153:6;35109:71;:::i;:::-;35190:72;35258:2;35247:9;35243:18;35234:6;35190:72;:::i;:::-;35272;35340:2;35329:9;35325:18;35316:6;35272:72;:::i;:::-;35391:9;35385:4;35381:20;35376:2;35365:9;35361:18;35354:48;35419:76;35490:4;35481:6;35419:76;:::i;:::-;35411:84;;34862:640;;;;;;;:::o;35508:141::-;35564:5;35595:6;35589:13;35580:22;;35611:32;35637:5;35611:32;:::i;:::-;35508:141;;;;:::o;35655:349::-;35724:6;35773:2;35761:9;35752:7;35748:23;35744:32;35741:119;;;35779:79;;:::i;:::-;35741:119;35899:1;35924:63;35979:7;35970:6;35959:9;35955:22;35924:63;:::i;:::-;35914:73;;35870:127;35655:349;;;;:::o
Swarm Source
ipfs://4d8cfc43c992b18b3a8180c54c90a166ed6c81b31ca3f61a722a2967a12d3a6e
Loading...
Loading
Loading...
Loading
OVERVIEW
Beings beyond imagination. Summon yours at: https://themagicalbeings.comMultichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.