ERC-721
Overview
Max Total Supply
443 CHUB
Holders
235
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 CHUBLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
ChublinsReborn
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-09-19 */ /* ___ _ _ __ __ ____ __ ____ _ _ ___ / __)( )_( )( )( )( _ \( ) (_ _)( \( )/ __) ( (__ ) _ ( )(__)( ) _ < )(__ _)(_ ) ( \__ \ \___)(_) (_)(______)(____/(____)(____)(_)\_)(___/ ~ Reborn ~ By Christian Montoya m0nt0y4.eth */ // SPDX-License-Identifier: MIT // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.2.2 // 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(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // 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; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @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; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.2.2 // 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 { // Reference type for token approval. struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`. 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 virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public 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 virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 0x80 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 0x20 + 3 * 0x20 = 0x80. str := add(mload(0x40), 0x80) // Update the free memory pointer to allocate. mstore(0x40, str) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } } // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`, * consuming from one or the other at each step according to the instructions given by * `proofFlags`. * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof} * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Base64.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Base64.sol) pragma solidity ^0.8.0; /** * @dev Provides a set of functions to operate with Base64 strings. * * _Available since v4.5._ */ library Base64 { /** * @dev Base64 Encoding/Decoding Table */ string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /** * @dev Converts a `bytes` to its Bytes64 `string` representation. */ function encode(bytes memory data) internal pure returns (string memory) { /** * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol */ if (data.length == 0) return ""; // Loads the table into memory string memory table = _TABLE; // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter // and split into 4 numbers of 6 bits. // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up // - `data.length + 2` -> Round up // - `/ 3` -> Number of 3-bytes chunks // - `4 *` -> 4 characters for each chunk string memory result = new string(4 * ((data.length + 2) / 3)); /// @solidity memory-safe-assembly assembly { // Prepare the lookup table (skip the first "length" byte) let tablePtr := add(table, 1) // Prepare result pointer, jump over length let resultPtr := add(result, 32) // Run over the input, 3 bytes at a time for { let dataPtr := data let endPtr := add(data, mload(data)) } lt(dataPtr, endPtr) { } { // Advance 3 bytes dataPtr := add(dataPtr, 3) let input := mload(dataPtr) // To write each character, shift the 3 bytes (18 bits) chunk // 4 times in blocks of 6 bits for each character (18, 12, 6, 0) // and apply logical AND with 0x3F which is the number of // the previous character in the ASCII table prior to the Base64 Table // The result is then added to the table to get the character to write, // and finally write it in the result pointer but with a left shift // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F)))) resultPtr := add(resultPtr, 1) // Advance } // When data `bytes` is not exactly 3 bytes long // it is padded with `=` characters at the end switch mod(mload(data), 3) case 1 { mstore8(sub(resultPtr, 1), 0x3d) mstore8(sub(resultPtr, 2), 0x3d) } case 2 { mstore8(sub(resultPtr, 1), 0x3d) } } return result; } } // File: contracts/ChublinsReborn.sol /* ___ _ _ __ __ ____ __ ____ _ _ ___ / __)( )_( )( )( )( _ \( ) (_ _)( \( )/ __) ( (__ ) _ ( )(__)( ) _ < )(__ _)(_ ) ( \__ \ \___)(_) (_)(______)(____/(____)(____)(_)\_)(___/ ~ Reborn ~ By Christian Montoya m0nt0y4.eth */ pragma solidity ^0.8.17; // Chublins Reborn Contract v1 // Creator: Christian Montoya contract ChublinsReborn is ERC721A, Ownable { constructor() ERC721A("Chublins Reborn", "CHUB") { } uint256 private _basePrice = 0.01 ether; uint16 private _maxSupply = 5556; uint16 private _maxMint = 2; bool private _publicMintOpen; bool private _pngsAvailable; bytes32 public merkleRoot; string private _baseTokenURI = "https://chublins.xyz/png/"; uint8[5556] private _chubFlags; // will track license status and whether to return PNG or SVG function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner { merkleRoot = _merkleRoot; } function openPublicMint() external onlyOwner { _publicMintOpen = true; } function isPublicMintOpen() external view returns (bool) { return _publicMintOpen; } function setMaxMintPerWallet(uint16 max) external onlyOwner { _maxMint = max; } function allowListMint(uint256 quantity, bytes32[] calldata merkleProof) external payable { require(maxSupply() >= (totalSupply() + quantity)); require(_numberMinted(msg.sender) + quantity <= _maxMint); require(msg.value == (_basePrice * quantity)); require(MerkleProof.verify(merkleProof, merkleRoot, keccak256(abi.encodePacked(msg.sender)))); _mint(msg.sender, quantity); } function mint(uint256 quantity) external payable { require(_publicMintOpen && maxSupply() >= (totalSupply() + quantity)); require(_numberMinted(msg.sender) + quantity <= _maxMint); require(msg.value == (_basePrice * quantity)); require(msg.sender == tx.origin); _mint(msg.sender, quantity); } // this is for raffles and for making secondary buyers from first collection whole function ownerMint(uint256 quantity) external onlyOwner { require(maxSupply() >= (totalSupply() + quantity)); _mint(msg.sender, quantity); } // traits string[8] private _bgColors = ["c0caff","ff6b6b","ffdd59","0be881","fd9644","a55eea","778ca3","f8a5c2"]; string[8] private _bgColorIds = ["sky","tomato","lemon","jade","clementine","royal","slate","sakura"]; string[3] private _ears = [ '', '<path d="M-46 -140 -26 -170 -6 -140M124 -137 144 -167 164 -137" class="lnft"/>', '<path d="M-48,-142 a0.9,1 0 0,1 60,-8M116,-146 a0.9,1 0 0,1 60,12" class="lnft th"/>' ]; string[3] private _earIds = ["none","cat","bear"]; string[4] private _hats = [ '', '<ellipse cx="62" cy="-128" rx="50" ry="15"/><path d="M27,-130 a1,1 0 0,1 70,0"/><path d="M27,-130 a6,1 0 1,0 70,0" stroke="gray" stroke-width="2"/>', '<path d="M16 -112a1 1 0 0 1 100 0M16 -112a2.5 1.5 18 1 0 100 0"/><path d="M17-112h99" stroke="#000" stroke-width="2"/><path d="M16-112a50 6.25 0 1 0 100 0" stroke="#555" stroke-width="2" stroke-linecap="round"/><text x="52" y="-117" fill="#ddd">chub</text>', '<path d="m62-146 4-58-40-20" class="lnrt"/><circle cx="26" cy="-224" r="14"/>' ]; string[4] private _hatIds = ["none","bowl","cap","antenna"]; string[14] private _eyes = [ '<circle cx="10" cy="10" r="10"/><circle cx="130" cy="10" r="10"/>', '<path id="eye" class="lnft" style="fill:#000;stroke-linejoin:round" d="M10.4-18v9.6V-18.1zm-17.7 7.7 6.2 7.3-6.2-7.3zm35.3 0-6.2 7.3 6.2-7.3zM10.4-3.8C.95-4.2-5.7 7.4-.65 15.3c4.3 8.4 17.7 8.4 22 0 4.6-7.2-.44-17.7-8.8-18.9-1.1-.15z"/><use xlink:href="#eye" transform="translate(120)"/>', '<g id="eye"><circle cx="10" cy="10" r="30"/><circle cx="25" cy="5" r="8" fill="#fff"/><circle cx="-8" cy="20" r="4" fill="#fff"/></g><use xlink:href="#eye" transform="translate(120)"/>', '<g id="eye"><circle cx="10" cy="10" r="30"/><circle cx="10" cy="10" r="24" class="wlrt"/></g><use xlink:href="#eye" transform="translate(120)"/>', '<rect x="24" y="-18" width="16" height="48" ry="8"/><rect x="100" y="-18" width="16" height="48" ry="8"/>', '<g class="lnrt"><path d="M40 10 A10 10 10 10 0 13 10"/><path d="M140 11 A10 10 10 10 100 12 10"/></g>', '<path class="lnrt" d="M-5 0h50M90 0h50"/><circle cx="28" cy="12" r="13"/><circle cx="123" cy="12" r="13"/>', '<path class="lnrt" d="m-12 18 25-36m0 0 25 36m62 0 25-36m0 0 25 36"/>', '<path d="m0-18 42 42M0 24l42-42m54 0 42 42m-42 0 42-42" class="lnrt"/>', '<path stroke="#000" class="th" d="M-5-30 44-6m63 0 48-24"/><circle cx="22" cy="12" r="13"/><circle cx="127" cy="12" r="13"/>', '<path class="lnrt" d="m-6 -16 40 24m0 0 -40 24m152 0 -40 -24m0 0 40 -24"/>', '<path id="eye" d="M13.3 36.3C-1.7 38.4-13 19.4-4 7.2c5-8.9 21-12.4 25.7-1.3 3.7 7.4-3.6 17.9-11.9 15.7-4-1.6-2.8-8.1 1.4-8.3 5.4-1.3.38-8.7-3.5-4.9C1.1 10.8-.35 20.5 4.9 25c4 3.9 10.4 3.1 14.8.4C31.5 19.3 31.1-.1 18.4-5.2 3-12-14.9 3.7-12.7 19.7c.7 5.5-8.4 6.3-8.7.8-2.7-21.2 19.5-41.4 40.3-34.9C37.1-9.6 43.1 15.8 29.8 28.5c-4.3 4.5-10.2 7.3-16.4 7.8Z"/><use xlink:href="#eye" transform="rotate(180 70 10)"/>', '<path d="M10.2-17.8c-7.5-.17-14.8 2-21.4 5.6-6.8 3.4-12.6 8.8-16.1 15.6-1.6 3.1.7 6.3 1.8 9.2 2.8 5.2 5.7 10.7 10.6 14.3 2 .8-.9-3.5-1.2-4.7-2.4-4.9-4.3-10-5.6-15.2 3.8-5 7.8-10 13.3-13.2 1.5-1.3 4.4-2.4 2.9.7-3.1 11.2-2.5 24.2 4.3 34 .8 2 5.2 4.3 4 6.1-2.2.6-1.6 1.5.3 1.2 8.9-.2 17.7-.5 26.9-1.3 3.3-.8-2.9-.9-3.7-1.4 2.4-3.6 5.3-7 6.6-11.2 3.2-8.5 3.5-17.9 1.2-26.6 2.2-.3 5.2 2.8 7.5 4.1 1.7.6 4.7 4.8 5.7 3.2-3.4-9-12.2-14.5-22.8-17.7-5.1-2-10.7-2.5-16.1-2.5ZM4.8 6.6c-.5 5.4 1.8 12.1 7.4 13.8 4.9 1.4 9.3-3 10.5-7.4 1.5-2.4-1-7.7 3.3-6.2 2.9.3 7.5.7 6.5 4.9-.7 6.6-3.3 13-7.7 18-1 .9-1.9 2.1-3 2.8l-14.9.7c-3.4-3.2-6.5-6.7-8.3-11-1.7-4-3.2-8.3-2.9-12.7 1.2-3.3 6.5-1.7 9.2-3Z" id="eye"/><use xlink:href="#eye" transform="matrix(-1 0 0 1 142 0)"/>', '<g fill="#f3322c"><path d="M-42 -3H96V7H-32V21H-42"/><g id="eye"><path fill="#fff" d="M-10 -23H40V27H-10z" stroke="#f3322c" stroke-width="10"/><path fill="#000" d="M15 -18H35V22H15z"/></g><use xlink:href="#eye" x="108"/></g>' ]; string[14] private _eyeIds = [ "tiny", "lashes", "bubble", "froyo", "socket", "chuffed", "displeased", "kitty", "deceased", "angry", "embarrassed", "dizzy", "anime", "nounish" ]; string[5] private _cheeks = [ '', '<g fill="pink"><ellipse cx="10" cy="60" rx="20" ry="10"/><ellipse cx="130" cy="60" rx="20" ry="10"/></g>', '<path d="m15 6 10 12a12.8 12.8 0 1 1-20 0L15 6z" fill="#8af" transform="rotate(5 -432.172 -87.711)"/>', '<path d="m15 6 10 12a12.8 12.8 0 1 1-20 0L15 6z" fill="none" stroke="black" stroke-width="3" transform="rotate(5 -432.172 -87.711)"/>', '<path id="chk" fill="#faf" d="M-9.5 24c.6-3.9 5-3.9 6.8-1.6 1.9-2.3 6.3-2.2 6.8 1.6.5 3.4-4 6.2-6.8 8.1-2.8-1.8-7.4-4.6-6.8-8.1z" transform="matrix(2 0 0 2.4 0 0)"/><use xlink:href="#chk" transform="translate(148)"/>' ]; string[5] private _cheekIds = [ "plain", "pink", "tear", "tattoo", "hearts" ]; string[12] private _mouths = [ '<path d="M39,100 a1,1 0 0,0 60,0"/>', '<path d="m39 116 61-0" class="lnrt"/>', '<path d="M-99 -124a1 .9 0 0 0 60 0" class="lnrt" transform="rotate(180)"/>', '<path d="M39,100 a1,0.9 0 0,0 60,0" class="lnrt"/>', '<g class="lnrt"><path d="M37 108a1 .7 0 0 0 62 0"/><path d="M-31 109a1 .2 0 0 0 20 0" transform="rotate(-30)"/></g>', '<path d="m27 120 14-10 14 10 14-10 14 10 14-10 14 10" class="lnrt"/>', '<ellipse cx="69" cy="114" rx="18" ry="24"/>', '<path d="M35 127c-5.2-5.8-5.5-15.6-.6-22.5 4.5-6.3 10.3-6.4 22.2-.3 11.4 5.9 15.9 5.9 25.8.02 9.6-5.7 15.1-6 19.6-1 5 5.6 6 12.7 2.9 20.1-3.8 9-9 10-21 3.9-12.3-6-17-6-28.7-.2-11.3 5.9-14.6 5.9-19.8.07z"/>', '<path d="M29,105 a1,1 0 0,0 40,0M70,105 a1,1 0 0,0 40,0" class="lnrt"/>', '<path d="M66,120 a0.6,0.6 0 0,0 0,-20M66,140 a1.2,1 0 0,0 0,-20" class="lnrt tn"/>', '<g class="lnrt"><path d="M60,128 a0.3,0.5 0 0,0 28,-3" fill="pink" class="tn"/><path d="M36,110 a0.99,0.5 0 0,0 65,0"/></g>', '<path d="M39,100 a1,1 0 0,0 60,0"/><path fill="#fff" d="M58 103H68V116H58M70 103H80V116H70"/>' ]; string[12] private _mouthIds = [ "happy", "uncertain", "sad", "elated", "chuffed", "angry", "shocked", "disgusted", "goopy", "kissy", "playful", "toothy" ]; string[6] private _accessories = [ '', '<path id="ac" d="m60,68c-12.4,0.9 -12.3,13.7 -29.3,12.3 7.3,13.5 24.4,13.4 34.3,6.8 9.8,-6.7 4.8,-19.7 -5,-19z"/><use xlink:href="#ac" transform="scale(-1,1),translate(-139)"/>', '<path fill="red" stroke="red" stroke-width="7" stroke-linejoin="round" d="m-44-82 20 15 20-15v30l-20-15-20 15z"/><rect x="-34.5" y="-77.5" width="21" height="21" rx="4" fill="red" stroke="#fff" stroke-width="2"/>', '<path d="M-12 -53c-3.7-2.1-6.1-6.2-6.1-10.6 0-4.4 2.3-8.5 6.1-10.7m-37.7 0c3.7 2.1 6.1 6.2 6.1 10.6 0 4.4-2.3 8.5-6.1 10.7m8.2 8.2c2.1-3.7 6.2-6.1 10.6-6.1 4.4 0 8.5 2.3 10.7 6.1m0-37.7c-2.1 3.7-6.2 6.1-10.6 6.1-4.4 0-8.5-2.3-10.7-6.1" class="lnrt tn"/>', '<path d="m2.5 10.8 1.5.5.4 1.6.4-1.6 1.5-.5-1.5-.5-.4-1.5-.4 1.5zM.5 3.5l2.1.7.6 2.2.6-2.2 2.1-.7-2.1-.7L3.2.7l-.6 2.2zm8.1-2L7.6 5.3l-2.6 1.1 2.6 1.1 1 3.8L9.7 7.4l2.5-1.1-2.5-1.1z" fill="#ffc502" transform="matrix(4.5 0 0 4.5 -92 -68)"/>', '<g class="lnrt tn" transform="matrix(.39878 -.01397 .035 .4 -150 -158)"><clipPath id="clp"><path d="M220 190h30v54h-30z"/></clipPath><ellipse id="b" cx="250" cy="217" rx="25" ry="27" fill="#f8b"/><use transform="rotate(60 250 250)" xlink:href="#b"/><use transform="rotate(120 250 250)" xlink:href="#b"/><use transform="rotate(180 250 250)" xlink:href="#b"/><use transform="rotate(240 250 250)" xlink:href="#b"/><use transform="rotate(300 250 250)" xlink:href="#b"/><use xlink:href="#b" clip-path="url(#clp)"/><circle cx="250" cy="250" r="18" fill="#fdc"/></g>' ]; string[6] private _accessoryIds = [ "none", "mustache", "bow", "pop", "sparkle", "flower" ]; string[3] private _filters = [ '', '<feTurbulence baseFrequency="0" type="fractalNoise" stitchTiles="noStitch"><animate id="wvy" attributeName="baseFrequency" dur="6s" begin="1.5s;wvy.end+1.5s" values="0;0.03;0" keyTimes="0;0.5;1" easing="ease-in-out"/></feTurbulence><feDisplacementMap in="SourceGraphic" scale="14"/>', '<feTurbulence baseFrequency="0.6" type="fractalNoise"/><feDisplacementMap in="SourceGraphic" scale="0"><animate id="gltch" attributeName="scale" dur="2.5s" begin="1.5s;gltch.end+3.5s" values="36.7;58.8;36.9;15;13.3;47.3;58.2;21.6;46.5;40.2;35.8;36.1;42.7;32.2;46.6;33.7;17.3;52.1;30.8;40.4;44;36.2;16.2;20;15.7;50.9;30.8"/></feDisplacementMap>' ]; string[3] private _filterIds = ["none", "wavy", "glitchy"]; string[3] private _licenses = ["ARR", "CC BY-NC", "CC0"]; function getLicense(uint256 id) public view returns (string memory) { require(_exists(id)); uint256 licenseId = _chubFlags[id] % 10; // 0, 1 or 2 if(licenseId > 2) { licenseId = 2; /* this should never happen */ } return _licenses[licenseId]; } function usePng(uint256 id) public view returns (bool) { require(_exists(id)); return _chubFlags[id] > 9; } struct chubData { uint8 bgColorIndex; uint8 earsIndex; uint8 hatIndex; uint8 eyesIndex; uint8 cheeksIndex; uint8 mouthIndex; uint8 accessoryIndex; uint8 filterIndex; uint8 licenseIndex; bool shimmer; } function makeChub(uint256 id) internal view returns (chubData memory) { chubData memory chub; // random background color uint256 rand = uint256(keccak256(abi.encodePacked(id, address(this), "1"))) % _bgColors.length; chub.bgColorIndex = uint8(rand); // random ears rand = uint256(keccak256(abi.encodePacked(id, address(this), "2"))) % 10; if(rand >= _ears.length) { rand = 0; } chub.earsIndex = uint8(rand); // random hats rand = uint256(keccak256(abi.encodePacked(id, address(this), "3"))) % 12; if(rand >= _hats.length) { rand = 0; } chub.hatIndex = uint8(rand); // random eyes rand = uint256(keccak256(abi.encodePacked(id, address(this), "4"))) % _eyes.length; chub.eyesIndex = uint8(rand); // random cheeks rand = uint256(keccak256(abi.encodePacked(id, address(this), "5"))) % 20; if(rand >= _cheeks.length) { rand = 0; } chub.cheeksIndex = uint8(rand); // random mouths rand = uint256(keccak256(abi.encodePacked(id, address(this), "6"))) % _mouths.length; chub.mouthIndex = uint8(rand); // random accessories rand = uint256(keccak256(abi.encodePacked(id, address(this), "7"))) % 24; if(rand >= _accessories.length) { rand = 0; } chub.accessoryIndex = uint8(rand); // random filters rand = uint256(keccak256(abi.encodePacked(id, address(this), "8"))) % 100; if(rand >= _filters.length) { rand = 0; } chub.filterIndex = uint8(rand); chub.licenseIndex = _chubFlags[id] % 10; // 0, 1 or 2 if(chub.licenseIndex > 2) { chub.licenseIndex = 2; /* this should never happen */ } // random shimmer rand = uint256(keccak256(abi.encodePacked(id, address(this), "9"))) % 16; chub.shimmer = ( rand < 1 ); return chub; } function makeSVG(chubData memory chub) internal view returns (string memory) { string memory filterUrl = ''; string memory filter = ''; if(chub.filterIndex > 0) { filterUrl = string.concat(" filter='url(#",_filterIds[chub.filterIndex],")'"); filter = string.concat('<filter id="',_filterIds[chub.filterIndex],'" x="-50%" y="-50%" width="200%" height="200%">',_filters[chub.filterIndex],'</filter>'); } string memory bgfilter = ''; if(chub.shimmer) { bgfilter = '<path d="M0 0H600V600H0" filter="url(#fbg)"/>'; filter = string.concat(filter,'<filter x="0" y="0" width="100%" height="100%" id="fbg"><feTurbulence baseFrequency="0.0024 0.0036" numOctaves="16" seed="18"/></filter>'); } string memory output = "<svg width='600' height='600' viewBox='0 0 600 600' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'><style>.lnft,.lnrt{stroke:#000;stroke-linecap:round}.lnft{fill:gray;stroke-width:8;}.lnrt{fill:none;stroke-width:7;stroke-linejoin:bezel}.th{stroke-width:12}.tn{stroke-width:4}.wlrt{stroke:#fff;stroke-width:3}text{font-family:'Comic Sans MS','Comic Sans','Chalkboard SE','Comic Neue',cursive;font-size:12pt}</style><defs>"; output = string.concat(output,filter,"</defs><path d='M0 0H600V600H0' fill='#",_bgColors[chub.bgColorIndex],"'/>",bgfilter,"<g id='chub' cursor='pointer'",filterUrl,"><g fill='#fff'><ellipse cx='300' cy='460' rx='160' ry='50'/><path d='M140 140h320v320H140z'/></g><ellipse cx='300' cy='140' rx='160' ry='50' fill='#F8F4F4'/><g id='face' transform='rotate(-5 3422.335 -2819.49)'>"); return string.concat(output,_ears[chub.earsIndex],_hats[chub.hatIndex],_eyes[chub.eyesIndex],_mouths[chub.mouthIndex],_cheeks[chub.cheeksIndex],_accessories[chub.accessoryIndex],"</g><animateMotion path='M0,0 -3,-9 0,-18 6,-9 2,0 0,4z' keyPoints='0;0.1875;0.375;0.5625;0.75;0.9;1' keyTimes='0;0.18;0.37;0.58;0.72;0.87;1' dur='0.6s' begin='click'/></g></svg>"); } function makeTrait(string memory tt, string memory tv) internal pure returns (string memory) { return string.concat('{"trait_type":"',tt,'","value":"',tv,'"}'); } function makeTraits(chubData memory chub) internal view returns (string memory) { string memory shimmer = chub.shimmer ? unicode"✨" : ""; shimmer = string.concat(_bgColorIds[chub.bgColorIndex],shimmer); return string.concat('[',makeTrait("BG Color",shimmer),',',makeTrait("Ears",_earIds[chub.earsIndex]),',',makeTrait("Hat",_hatIds[chub.hatIndex]),',',makeTrait("Eyes",_eyeIds[chub.eyesIndex]),',',makeTrait("Mouth",_mouthIds[chub.mouthIndex]),',',makeTrait("Cheeks",_cheekIds[chub.cheeksIndex]),',',makeTrait("Accessory",_accessoryIds[chub.accessoryIndex]),',',makeTrait("Filter",_filterIds[chub.filterIndex]),',',makeTrait("License",_licenses[chub.licenseIndex]),']'); } function tokenSVG(uint256 tokenId) external view returns (string memory) { require(_exists(tokenId)); return makeSVG(makeChub(tokenId)); } function tokenTraits(uint256 tokenId) external view returns (string memory) { require(_exists(tokenId)); return makeTraits(makeChub(tokenId)); } function tokenURI(uint256 tokenId) override public view returns (string memory) { require(_exists(tokenId)); chubData memory chub = makeChub(tokenId); string memory output; if(usePng(tokenId) && _pngsAvailable) { output = string.concat(_baseTokenURI, _toString(tokenId), ".png"); } else { output = string.concat("data:image/svg+xml;base64,", Base64.encode(bytes(makeSVG(chub)))); } output = string.concat('{"name":"Chublin #',_toString(tokenId),'", "description":"A Chublin born of the blockchain.","attributes":',makeTraits(chub),', "image":"', output, '"}'); return string.concat('data:application/json;base64,',Base64.encode(bytes(output))); } function maxSupply() public view returns (uint16) { return _maxSupply; } function reduceSupply(uint16 value) external onlyOwner { require(totalSupply() < value && value < maxSupply()); _maxSupply = value; } function setBaseURI(string calldata baseURI) external onlyOwner { _baseTokenURI = baseURI; } function withdrawFunds() external onlyOwner { (bool success, ) = msg.sender.call{value: address(this).balance}(""); require(success); } function pngsAvailable() external view returns (bool) { return _pngsAvailable; } function togglePNGsAvailable() external onlyOwner { _pngsAvailable = !_pngsAvailable; } function toggleOnChainArt(uint256 tokenId) external returns(bool){ require(ownerOf(tokenId) == msg.sender); if(usePng(tokenId)) { unchecked { _chubFlags[tokenId] -= 10; } } else { unchecked { _chubFlags[tokenId] += 10; } } return usePng(tokenId); } function modifyLicense(uint256 tokenId, uint8 level) external returns(string memory){ require(ownerOf(tokenId) == msg.sender); require(level == 1 || level == 2); uint8 currentLicense = _chubFlags[tokenId] % 10; // 0, 1 or 2 if(currentLicense == 0) { // if current level is 0, you can set it to 1 or 2 unchecked { _chubFlags[tokenId] += level; } return _licenses[level]; } else if(currentLicense == 1 && level == 2) { // if current level is 1 or 2, you can set it to 2 unchecked { _chubFlags[tokenId] += 1; } return _licenses[level]; } revert(); } // thank you for reading my contract }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"allowListMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getLicense","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"isPublicMintOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint8","name":"level","type":"uint8"}],"name":"modifyLicense","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openPublicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pngsAvailable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"value","type":"uint16"}],"name":"reduceSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"max","type":"uint16"}],"name":"setMaxMintPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","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":"toggleOnChainArt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePNGsAvailable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenSVG","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenTraits","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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"usePng","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052662386f26fc100006009556115b4600a60006101000a81548161ffff021916908361ffff1602179055506002600a60026101000a81548161ffff021916908361ffff1602179055506040518060400160405280601981526020017f68747470733a2f2f636875626c696e732e78797a2f706e672f00000000000000815250600c908162000092919062001e46565b506040518061010001604052806040518060400160405280600681526020017f633063616666000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f666636623662000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f666664643539000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f306265383831000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f666439363434000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f613535656561000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f373738636133000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f663861356332000000000000000000000000000000000000000000000000000081525081525060bb90600862000287929190620018fa565b506040518061010001604052806040518060400160405280600381526020017f736b79000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f746f6d61746f000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f6c656d6f6e00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f6a6164650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f636c656d656e74696e650000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f726f79616c00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f736c61746500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f73616b757261000000000000000000000000000000000000000000000000000081525081525060c39060086200047c929190620018fa565b5060405180606001604052806040518060200160405280600081525081526020016040518060800160405280604e815260200162009435604e91398152602001604051806080016040528060548152602001620091e06054913981525060cb906003620004eb9291906200194d565b5060405180606001604052806040518060400160405280600481526020017f6e6f6e650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f636174000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f626561720000000000000000000000000000000000000000000000000000000081525081525060ce906003620005b89291906200194d565b5060405180608001604052806040518060200160405280600081525081526020016040518060c001604052806093815260200162007f28609391398152602001604051806101200160405280610100815260200162009557610100913981526020016040518060800160405280604d815260200162008093604d913981525060d190600462000649929190620019a0565b5060405180608001604052806040518060400160405280600481526020017f6e6f6e650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f626f776c0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f636170000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f616e74656e6e610000000000000000000000000000000000000000000000000081525081525060d590600462000751929190620019a0565b50604051806101c0016040528060405180608001604052806041815260200162007c8b60419139815260200160405180610140016040528061011e815260200162007cfe61011e913981526020016040518060e0016040528060b881526020016200814560b8913981526020016040518060c001604052806090815260200162007e986090913981526020016040518060a0016040528060698152602001620096576069913981526020016040518060a0016040528060658152602001620080e06065913981526020016040518060a00160405280606a815260200162008bc1606a913981526020016040518060800160405280604581526020016200923460459139815260200160405180608001604052806046815260200162008c2b6046913981526020016040518060a00160405280607c815260200162007e1c607c913981526020016040518060800160405280604a815260200162007c41604a91398152602001604051806101c0016040528061019981526020016200849b610199913981526020016040518061032001604052806102f08152602001620088046102f09139815260200160405180610100016040528060e0815260200162008ea260e0913981525060d990600e6200092a929190620019f3565b50604051806101c001604052806040518060400160405280600481526020017f74696e790000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f6c6173686573000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f627562626c65000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f66726f796f00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f736f636b6574000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f636875666665640000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f646973706c65617365640000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f6b6974747900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f646563656173656400000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f616e67727900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f656d62617272617373656400000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f64697a7a7900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f616e696d6500000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f6e6f756e6973680000000000000000000000000000000000000000000000000081525081525060e790600e62000c81929190620019f3565b506040518060a001604052806040518060200160405280600081525081526020016040518060a001604052806068815260200162008cce6068913981526020016040518060a0016040528060658152602001620092796065913981526020016040518060c001604052806085815260200162008ffd60859139815260200160405180610100016040528060d8815260200162007fbb60d8913981525060f590600562000d2f92919062001a46565b506040518060a001604052806040518060400160405280600581526020017f706c61696e00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f70696e6b0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f746561720000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f746174746f6f000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f686561727473000000000000000000000000000000000000000000000000000081525081525060fa90600562000e7292919062001a46565b5060405180610180016040528060405180606001604052806023815260200162008634602391398152602001604051806060016040528060258152602001620084766025913981526020016040518060800160405280604a8152602001620081fd604a9139815260200160405180606001604052806032815260200162007ccc6032913981526020016040518060a0016040528060738152602001620096c06073913981526020016040518060800160405280604481526020016200919c6044913981526020016040518060600160405280602b815260200162009082602b9139815260200160405180610100016040528060cd815260200162008af460cd9139815260200160405180608001604052806047815260200162007bfa60479139815260200160405180608001604052806052815260200162008e506052913981526020016040518060a00160405280607b815260200162008f82607b913981526020016040518060800160405280605d815260200162008c71605d913981525060ff90600c6200100492919062001a99565b506040518061018001604052806040518060400160405280600581526020017f686170707900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f756e6365727461696e000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f736164000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f656c61746564000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f636875666665640000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f616e67727900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f73686f636b65640000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f646973677573746564000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f676f6f707900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f6b6973737900000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f706c617966756c0000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f746f6f746879000000000000000000000000000000000000000000000000000081525081525061010b90600c620012e692919062001a99565b506040518060c001604052806040518060200160405280600081525081526020016040518060e0016040528060b081526020016200875460b09139815260200160405180610100016040528060d481526020016200948360d49139815260200160405180610120016040528060fd81526020016200865760fd9139815260200160405180610120016040528060ef8152602001620090ad60ef9139815260200160405180610260016040528061022f81526020016200824761022f9139815250610117906006620013b992919062001aec565b506040518060c001604052806040518060400160405280600481526020017f6e6f6e650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f6d7573746163686500000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f626f77000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f706f70000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f737061726b6c650000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f666c6f776572000000000000000000000000000000000000000000000000000081525081525061011d9060066200153892919062001aec565b50604051806060016040528060405180602001604052806000815250815260200160405180610140016040528061011a815260200162008d3661011a913981526020016040518061018001604052806101578152602001620092de6101579139815250610123906003620015ae9291906200194d565b5060405180606001604052806040518060400160405280600481526020017f6e6f6e650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f776176790000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f676c6974636879000000000000000000000000000000000000000000000000008152508152506101269060036200167c9291906200194d565b5060405180606001604052806040518060400160405280600381526020017f415252000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f43432042592d4e4300000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f43433000000000000000000000000000000000000000000000000000000000008152508152506101299060036200174a9291906200194d565b503480156200175857600080fd5b506040518060400160405280600f81526020017f436875626c696e73205265626f726e00000000000000000000000000000000008152506040518060400160405280600481526020017f43485542000000000000000000000000000000000000000000000000000000008152508160029081620017d6919062001e46565b508060039081620017e8919062001e46565b50620017f96200182760201b60201c565b600081905550505062001821620018156200182c60201b60201c565b6200183460201b60201c565b62001f2d565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82600881019282156200193a579160200282015b828111156200193957825182908162001928919062001e46565b50916020019190600101906200190e565b5b50905062001949919062001b3f565b5090565b82600381019282156200198d579160200282015b828111156200198c5782518290816200197b919062001e46565b509160200191906001019062001961565b5b5090506200199c919062001b3f565b5090565b8260048101928215620019e0579160200282015b82811115620019df578251829081620019ce919062001e46565b5091602001919060010190620019b4565b5b509050620019ef919062001b3f565b5090565b82600e810192821562001a33579160200282015b8281111562001a3257825182908162001a21919062001e46565b509160200191906001019062001a07565b5b50905062001a42919062001b3f565b5090565b826005810192821562001a86579160200282015b8281111562001a8557825182908162001a74919062001e46565b509160200191906001019062001a5a565b5b50905062001a95919062001b3f565b5090565b82600c810192821562001ad9579160200282015b8281111562001ad857825182908162001ac7919062001e46565b509160200191906001019062001aad565b5b50905062001ae8919062001b3f565b5090565b826006810192821562001b2c579160200282015b8281111562001b2b57825182908162001b1a919062001e46565b509160200191906001019062001b00565b5b50905062001b3b919062001b3f565b5090565b5b8082111562001b63576000818162001b59919062001b67565b5060010162001b40565b5090565b50805462001b759062001c35565b6000825580601f1062001b89575062001baa565b601f01602090049060005260206000209081019062001ba9919062001bad565b5b50565b5b8082111562001bc857600081600090555060010162001bae565b5090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062001c4e57607f821691505b60208210810362001c645762001c6362001c06565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262001cce7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262001c8f565b62001cda868362001c8f565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062001d2762001d2162001d1b8462001cf2565b62001cfc565b62001cf2565b9050919050565b6000819050919050565b62001d438362001d06565b62001d5b62001d528262001d2e565b84845462001c9c565b825550505050565b600090565b62001d7262001d63565b62001d7f81848462001d38565b505050565b5b8181101562001da75762001d9b60008262001d68565b60018101905062001d85565b5050565b601f82111562001df65762001dc08162001c6a565b62001dcb8462001c7f565b8101602085101562001ddb578190505b62001df362001dea8562001c7f565b83018262001d84565b50505b505050565b600082821c905092915050565b600062001e1b6000198460080262001dfb565b1980831691505092915050565b600062001e36838362001e08565b9150826002028217905092915050565b62001e518262001bcc565b67ffffffffffffffff81111562001e6d5762001e6c62001bd7565b5b62001e79825462001c35565b62001e8682828562001dab565b600060209050601f83116001811462001ebe576000841562001ea9578287015190505b62001eb5858262001e28565b86555062001f25565b601f19841662001ece8662001c6a565b60005b8281101562001ef85784890151825560018201915060208501945060208101905062001ed1565b8683101562001f18578489015162001f14601f89168262001e08565b8355505b6001600288020188555050505b505050505050565b615cbd8062001f3d6000396000f3fe60806040526004361061021a5760003560e01c80638da5cb5b11610123578063c87b56dd116100ab578063ec8bda8e1161006f578063ec8bda8e146107c2578063ed5e4e2b146107de578063f19e75d41461081b578063f2fde38b14610844578063faf021461461086d5761021a565b8063c87b56dd146106b5578063d5abeb01146106f2578063d697ef5d1461071d578063e05c57bf14610748578063e985e9c5146107855761021a565b8063a0712d68116100f2578063a0712d68146105df578063a22cb465146105fb578063a4435dfd14610624578063b2dd12121461064f578063b88d4fde1461068c5761021a565b80638da5cb5b1461052357806395d89b411461054e578063987222b5146105795780639bac5f7a146105a25761021a565b80632eb4a7ab116101a65780636352211e116101755780636352211e1461044057806370a082311461047d578063715018a6146104ba57806374ea7fc1146104d15780637cb64759146104fa5761021a565b80632eb4a7ab146103ac57806342842e0e146103d757806345f7e06e1461040057806355f804b3146104175761021a565b80630a85202e116101ed5780630a85202e146102ed5780630e87c9711461032a57806318160ddd1461034157806323b872dd1461036c57806324600fc3146103955761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190613a20565b6108aa565b6040516102539190613a68565b60405180910390f35b34801561026857600080fd5b5061027161093c565b60405161027e9190613b13565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a99190613b6b565b6109ce565b6040516102bb9190613bd9565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e69190613c20565b610a4d565b005b3480156102f957600080fd5b50610314600480360381019061030f9190613c99565b610b91565b6040516103219190613b13565b60405180910390f35b34801561033657600080fd5b5061033f610e42565b005b34801561034d57600080fd5b50610356610eea565b6040516103639190613ce8565b60405180910390f35b34801561037857600080fd5b50610393600480360381019061038e9190613d03565b610f01565b005b3480156103a157600080fd5b506103aa611223565b005b3480156103b857600080fd5b506103c1611318565b6040516103ce9190613d6f565b60405180910390f35b3480156103e357600080fd5b506103fe60048036038101906103f99190613d03565b61131e565b005b34801561040c57600080fd5b5061041561133e565b005b34801561042357600080fd5b5061043e60048036038101906104399190613def565b6113d7565b005b34801561044c57600080fd5b5061046760048036038101906104629190613b6b565b611469565b6040516104749190613bd9565b60405180910390f35b34801561048957600080fd5b506104a4600480360381019061049f9190613e3c565b61147b565b6040516104b19190613ce8565b60405180910390f35b3480156104c657600080fd5b506104cf611533565b005b3480156104dd57600080fd5b506104f860048036038101906104f39190613ea3565b6115bb565b005b34801561050657600080fd5b50610521600480360381019061051c9190613efc565b611657565b005b34801561052f57600080fd5b506105386116dd565b6040516105459190613bd9565b60405180910390f35b34801561055a57600080fd5b50610563611707565b6040516105709190613b13565b60405180910390f35b34801561058557600080fd5b506105a0600480360381019061059b9190613ea3565b611799565b005b3480156105ae57600080fd5b506105c960048036038101906105c49190613b6b565b611866565b6040516105d69190613b13565b60405180910390f35b6105f960048036038101906105f49190613b6b565b611892565b005b34801561060757600080fd5b50610622600480360381019061061d9190613f55565b611966565b005b34801561063057600080fd5b50610639611add565b6040516106469190613a68565b60405180910390f35b34801561065b57600080fd5b5061067660048036038101906106719190613b6b565b611af4565b6040516106839190613b13565b60405180910390f35b34801561069857600080fd5b506106b360048036038101906106ae91906140c5565b611bfb565b005b3480156106c157600080fd5b506106dc60048036038101906106d79190613b6b565b611c6e565b6040516106e99190613b13565b60405180910390f35b3480156106fe57600080fd5b50610707611d83565b6040516107149190614157565b60405180910390f35b34801561072957600080fd5b50610732611d9b565b60405161073f9190613a68565b60405180910390f35b34801561075457600080fd5b5061076f600480360381019061076a9190613b6b565b611db2565b60405161077c9190613b13565b60405180910390f35b34801561079157600080fd5b506107ac60048036038101906107a79190614172565b611dde565b6040516107b99190613a68565b60405180910390f35b6107dc60048036038101906107d79190614208565b611e72565b005b3480156107ea57600080fd5b5061080560048036038101906108009190613b6b565b611f75565b6040516108129190613a68565b60405180910390f35b34801561082757600080fd5b50610842600480360381019061083d9190613b6b565b61206d565b005b34801561085057600080fd5b5061086b60048036038101906108669190613e3c565b612120565b005b34801561087957600080fd5b50610894600480360381019061088f9190613b6b565b612217565b6040516108a19190613a68565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061090557506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109355750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461094b90614297565b80601f016020809104026020016040519081016040528092919081815260200182805461097790614297565b80156109c45780601f10610999576101008083540402835291602001916109c4565b820191906000526020600020905b8154815290600101906020018083116109a757829003601f168201915b5050505050905090565b60006109d982612263565b610a0f576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a5882611469565b90508073ffffffffffffffffffffffffffffffffffffffff16610a796122c2565b73ffffffffffffffffffffffffffffffffffffffff1614610adc57610aa581610aa06122c2565b611dde565b610adb576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60603373ffffffffffffffffffffffffffffffffffffffff16610bb384611469565b73ffffffffffffffffffffffffffffffffffffffff1614610bd357600080fd5b60018260ff161480610be8575060028260ff16145b610bf157600080fd5b6000600a600d856115b48110610c0a57610c096142c8565b5b602091828204019190069054906101000a900460ff16610c2a9190614326565b905060008160ff1603610d295782600d856115b48110610c4d57610c4c6142c8565b5b602091828204019190068282829054906101000a900460ff160192506101000a81548160ff021916908360ff1602179055506101298360ff1660038110610c9757610c966142c8565b5b018054610ca390614297565b80601f0160208091040260200160405190810160405280929190818152602001828054610ccf90614297565b8015610d1c5780601f10610cf157610100808354040283529160200191610d1c565b820191906000526020600020905b815481529060010190602001808311610cff57829003601f168201915b5050505050915050610e3c565b60018160ff16148015610d3f575060028360ff16145b15610e37576001600d856115b48110610d5b57610d5a6142c8565b5b602091828204019190068282829054906101000a900460ff160192506101000a81548160ff021916908360ff1602179055506101298360ff1660038110610da557610da46142c8565b5b018054610db190614297565b80601f0160208091040260200160405190810160405280929190818152602001828054610ddd90614297565b8015610e2a5780601f10610dff57610100808354040283529160200191610e2a565b820191906000526020600020905b815481529060010190602001808311610e0d57829003601f168201915b5050505050915050610e3c565b600080fd5b92915050565b610e4a6122ca565b73ffffffffffffffffffffffffffffffffffffffff16610e686116dd565b73ffffffffffffffffffffffffffffffffffffffff1614610ebe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb5906143a3565b60405180910390fd5b600a60059054906101000a900460ff1615600a60056101000a81548160ff021916908315150217905550565b6000610ef46122d2565b6001546000540303905090565b6000610f0c826122d7565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f73576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610f7f846123a3565b91509150610f958187610f906122c2565b6123ca565b610fe157610faa86610fa56122c2565b611dde565b610fe0576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611047576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611054868686600161240e565b801561105f57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061112d85611109888887612414565b7c02000000000000000000000000000000000000000000000000000000001761243c565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036111b357600060018501905060006004600083815260200190815260200160002054036111b15760005481146111b0578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461121b8686866001612467565b505050505050565b61122b6122ca565b73ffffffffffffffffffffffffffffffffffffffff166112496116dd565b73ffffffffffffffffffffffffffffffffffffffff161461129f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611296906143a3565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16476040516112c5906143f4565b60006040518083038185875af1925050503d8060008114611302576040519150601f19603f3d011682016040523d82523d6000602084013e611307565b606091505b505090508061131557600080fd5b50565b600b5481565b61133983838360405180602001604052806000815250611bfb565b505050565b6113466122ca565b73ffffffffffffffffffffffffffffffffffffffff166113646116dd565b73ffffffffffffffffffffffffffffffffffffffff16146113ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b1906143a3565b60405180910390fd5b6001600a60046101000a81548160ff021916908315150217905550565b6113df6122ca565b73ffffffffffffffffffffffffffffffffffffffff166113fd6116dd565b73ffffffffffffffffffffffffffffffffffffffff1614611453576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144a906143a3565b60405180910390fd5b8181600c91826114649291906145c0565b505050565b6000611474826122d7565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114e2576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61153b6122ca565b73ffffffffffffffffffffffffffffffffffffffff166115596116dd565b73ffffffffffffffffffffffffffffffffffffffff16146115af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a6906143a3565b60405180910390fd5b6115b9600061246d565b565b6115c36122ca565b73ffffffffffffffffffffffffffffffffffffffff166115e16116dd565b73ffffffffffffffffffffffffffffffffffffffff1614611637576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162e906143a3565b60405180910390fd5b80600a60026101000a81548161ffff021916908361ffff16021790555050565b61165f6122ca565b73ffffffffffffffffffffffffffffffffffffffff1661167d6116dd565b73ffffffffffffffffffffffffffffffffffffffff16146116d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ca906143a3565b60405180910390fd5b80600b8190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461171690614297565b80601f016020809104026020016040519081016040528092919081815260200182805461174290614297565b801561178f5780601f106117645761010080835404028352916020019161178f565b820191906000526020600020905b81548152906001019060200180831161177257829003601f168201915b5050505050905090565b6117a16122ca565b73ffffffffffffffffffffffffffffffffffffffff166117bf6116dd565b73ffffffffffffffffffffffffffffffffffffffff1614611815576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180c906143a3565b60405180910390fd5b8061ffff16611822610eea565b10801561183d5750611832611d83565b61ffff168161ffff16105b61184657600080fd5b80600a60006101000a81548161ffff021916908361ffff16021790555050565b606061187182612263565b61187a57600080fd5b61188b61188683612533565b6128ad565b9050919050565b600a60049054906101000a900460ff1680156118cb5750806118b2610eea565b6118bc91906146bf565b6118c4611d83565b61ffff1610155b6118d457600080fd5b600a60029054906101000a900461ffff1661ffff16816118f333612b1e565b6118fd91906146bf565b111561190857600080fd5b8060095461191691906146f3565b341461192157600080fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461195957600080fd5b6119633382612b75565b50565b61196e6122c2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119d2576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006119df6122c2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a8c6122c2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ad19190613a68565b60405180910390a35050565b6000600a60049054906101000a900460ff16905090565b6060611aff82612263565b611b0857600080fd5b6000600a600d846115b48110611b2157611b206142c8565b5b602091828204019190069054906101000a900460ff16611b419190614326565b60ff1690506002811115611b5457600290505b6101298160038110611b6957611b686142c8565b5b018054611b7590614297565b80601f0160208091040260200160405190810160405280929190818152602001828054611ba190614297565b8015611bee5780601f10611bc357610100808354040283529160200191611bee565b820191906000526020600020905b815481529060010190602001808311611bd157829003601f168201915b5050505050915050919050565b611c06848484610f01565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611c6857611c3184848484612d30565b611c67576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060611c7982612263565b611c8257600080fd5b6000611c8d83612533565b90506060611c9a84612217565b8015611cb25750600a60059054906101000a900460ff165b15611ce957600c611cc285612e80565b604051602001611cd392919061481a565b6040516020818303038152906040529050611d1c565b611cfa611cf5836128ad565b612ec7565b604051602001611d0a9190614873565b60405160208183030381529060405290505b611d2584612e80565b611d2e8361302a565b82604051602001611d41939291906149a3565b6040516020818303038152906040529050611d5b81612ec7565b604051602001611d6b9190614a32565b60405160208183030381529060405292505050919050565b6000600a60009054906101000a900461ffff16905090565b6000600a60059054906101000a900460ff16905090565b6060611dbd82612263565b611dc657600080fd5b611dd7611dd283612533565b61302a565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b82611e7b610eea565b611e8591906146bf565b611e8d611d83565b61ffff161015611e9c57600080fd5b600a60029054906101000a900461ffff1661ffff1683611ebb33612b1e565b611ec591906146bf565b1115611ed057600080fd5b82600954611ede91906146f3565b3414611ee957600080fd5b611f5d828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600b5433604051602001611f429190614aa0565b60405160208183030381529060405280519060200120613850565b611f6657600080fd5b611f703384612b75565b505050565b60003373ffffffffffffffffffffffffffffffffffffffff16611f9783611469565b73ffffffffffffffffffffffffffffffffffffffff1614611fb757600080fd5b611fc082612217565b1561201357600a600d836115b48110611fdc57611fdb6142c8565b5b602091828204019190068282829054906101000a900460ff160392506101000a81548160ff021916908360ff16021790555061205d565b600a600d836115b4811061202a576120296142c8565b5b602091828204019190068282829054906101000a900460ff160192506101000a81548160ff021916908360ff1602179055505b61206682612217565b9050919050565b6120756122ca565b73ffffffffffffffffffffffffffffffffffffffff166120936116dd565b73ffffffffffffffffffffffffffffffffffffffff16146120e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e0906143a3565b60405180910390fd5b806120f2610eea565b6120fc91906146bf565b612104611d83565b61ffff16101561211357600080fd5b61211d3382612b75565b50565b6121286122ca565b73ffffffffffffffffffffffffffffffffffffffff166121466116dd565b73ffffffffffffffffffffffffffffffffffffffff161461219c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612193906143a3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361220b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220290614b2d565b60405180910390fd5b6122148161246d565b50565b600061222282612263565b61222b57600080fd5b6009600d836115b48110612242576122416142c8565b5b602091828204019190069054906101000a900460ff1660ff16119050919050565b60008161226e6122d2565b1115801561227d575060005482105b80156122bb575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600033905090565b600090565b600080829050806122e66122d2565b1161236c5760005481101561236b5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612369575b6000810361235f576004600083600190039350838152602001908152602001600020549050612335565b809250505061239e565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861242b868684613867565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61253b613944565b612543613944565b60006008843060405160200161255a929190614bba565b6040516020818303038152906040528051906020012060001c61257d9190614bf1565b905080826000019060ff16908160ff1681525050600a84306040516020016125a6929190614c6e565b6040516020818303038152906040528051906020012060001c6125c99190614bf1565b9050600381106125d857600090505b80826020019060ff16908160ff1681525050600c84306040516020016125ff929190614cf1565b6040516020818303038152906040528051906020012060001c6126229190614bf1565b90506004811061263157600090505b80826040019060ff16908160ff1681525050600e8430604051602001612658929190614d74565b6040516020818303038152906040528051906020012060001c61267b9190614bf1565b905080826060019060ff16908160ff1681525050601484306040516020016126a4929190614df7565b6040516020818303038152906040528051906020012060001c6126c79190614bf1565b9050600581106126d657600090505b80826080019060ff16908160ff1681525050600c84306040516020016126fd929190614e7a565b6040516020818303038152906040528051906020012060001c6127209190614bf1565b9050808260a0019060ff16908160ff168152505060188430604051602001612749929190614efd565b6040516020818303038152906040528051906020012060001c61276c9190614bf1565b90506006811061277b57600090505b808260c0019060ff16908160ff1681525050606484306040516020016127a2929190614f80565b6040516020818303038152906040528051906020012060001c6127c59190614bf1565b9050600381106127d457600090505b808260e0019060ff16908160ff1681525050600a600d856115b481106127fd576127fc6142c8565b5b602091828204019190069054906101000a900460ff1661281d9190614326565b82610100019060ff16908160ff1681525050600282610100015160ff16111561285557600282610100019060ff16908160ff16815250505b6010843060405160200161286a929190615003565b6040516020818303038152906040528051906020012060001c61288d9190614bf1565b905060018110826101200190151590811515815250508192505050919050565b60606000604051806020016040528060008152509050600060405180602001604052806000815250905060008460e0015160ff161115612982576101268460e0015160ff1660038110612903576129026142c8565b5b016040516020016129149190615086565b60405160208183030381529060405291506101268460e0015160ff1660038110612941576129406142c8565b5b016101238560e0015160ff166003811061295e5761295d6142c8565b5b01604051602001612970929190615179565b60405160208183030381529060405290505b6000604051806020016040528060008152509050846101200151156129df576040518060600160405280602d8152602001615a98602d91399050816040516020016129cd91906152aa565b60405160208183030381529060405291505b60006040518061020001604052806101c38152602001615ac56101c391399050808360bb886000015160ff1660088110612a1c57612a1b6142c8565b5b018487604051602001612a339594939291906154ba565b60405160208183030381529060405290508060cb876020015160ff1660038110612a6057612a5f6142c8565b5b0160d1886040015160ff1660048110612a7c57612a7b6142c8565b5b0160d9896060015160ff16600e8110612a9857612a976142c8565b5b0160ff8a60a0015160ff16600c8110612ab457612ab36142c8565b5b0160f58b6080015160ff1660058110612ad057612acf6142c8565b5b016101178c60c0015160ff1660068110612aed57612aec6142c8565b5b01604051602001612b049796959493929190615643565b604051602081830303815290604052945050505050919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60008054905060008203612bb5576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612bc2600084838561240e565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612c3983612c2a6000866000612414565b612c3385613870565b1761243c565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612cda57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612c9f565b5060008203612d15576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050612d2b6000848385612467565b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d566122c2565b8786866040518563ffffffff1660e01b8152600401612d789493929190615708565b6020604051808303816000875af1925050508015612db457506040513d601f19601f82011682018060405250810190612db19190615769565b60015b612e2d573d8060008114612de4576040519150601f19603f3d011682016040523d82523d6000602084013e612de9565b606091505b506000815103612e25576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060806040510190508060405280825b600115612eb357600183039250600a81066030018353600a8104905080612e91575b508181036020830392508083525050919050565b60606000825103612ee957604051806020016040528060008152509050613025565b6000604051806060016040528060408152602001615a586040913990506000600360028551612f1891906146bf565b612f229190615796565b6004612f2e91906146f3565b67ffffffffffffffff811115612f4757612f46613f9a565b5b6040519080825280601f01601f191660200182016040528015612f795781602001600182028036833780820191505090505b509050600182016020820185865187015b80821015612fe5576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845360018401935050612f8a565b505060038651066001811461300157600281146130145761301c565b603d6001830353603d600283035361301c565b603d60018303535b50505080925050505b919050565b6060600082610120015161304d5760405180602001604052806000815250613084565b6040518060400160405280600381526020017fe29ca800000000000000000000000000000000000000000000000000000000008152505b905060c3836000015160ff16600881106130a1576130a06142c8565b5b01816040516020016130b49291906157c7565b60405160208183030381529060405290506131046040518060400160405280600881526020017f424720436f6c6f7200000000000000000000000000000000000000000000000081525082613880565b6131e76040518060400160405280600481526020017f456172730000000000000000000000000000000000000000000000000000000081525060ce866020015160ff1660038110613158576131576142c8565b5b01805461316490614297565b80601f016020809104026020016040519081016040528092919081815260200182805461319090614297565b80156131dd5780601f106131b2576101008083540402835291602001916131dd565b820191906000526020600020905b8154815290600101906020018083116131c057829003601f168201915b5050505050613880565b6132ca6040518060400160405280600381526020017f486174000000000000000000000000000000000000000000000000000000000081525060d5876040015160ff166004811061323b5761323a6142c8565b5b01805461324790614297565b80601f016020809104026020016040519081016040528092919081815260200182805461327390614297565b80156132c05780601f10613295576101008083540402835291602001916132c0565b820191906000526020600020905b8154815290600101906020018083116132a357829003601f168201915b5050505050613880565b6133ad6040518060400160405280600481526020017f457965730000000000000000000000000000000000000000000000000000000081525060e7886060015160ff16600e811061331e5761331d6142c8565b5b01805461332a90614297565b80601f016020809104026020016040519081016040528092919081815260200182805461335690614297565b80156133a35780601f10613378576101008083540402835291602001916133a3565b820191906000526020600020905b81548152906001019060200180831161338657829003601f168201915b5050505050613880565b6134916040518060400160405280600581526020017f4d6f75746800000000000000000000000000000000000000000000000000000081525061010b8960a0015160ff16600c8110613402576134016142c8565b5b01805461340e90614297565b80601f016020809104026020016040519081016040528092919081815260200182805461343a90614297565b80156134875780601f1061345c57610100808354040283529160200191613487565b820191906000526020600020905b81548152906001019060200180831161346a57829003601f168201915b5050505050613880565b6135746040518060400160405280600681526020017f436865656b73000000000000000000000000000000000000000000000000000081525060fa8a6080015160ff16600581106134e5576134e46142c8565b5b0180546134f190614297565b80601f016020809104026020016040519081016040528092919081815260200182805461351d90614297565b801561356a5780601f1061353f5761010080835404028352916020019161356a565b820191906000526020600020905b81548152906001019060200180831161354d57829003601f168201915b5050505050613880565b6136586040518060400160405280600981526020017f4163636573736f7279000000000000000000000000000000000000000000000081525061011d8b60c0015160ff16600681106135c9576135c86142c8565b5b0180546135d590614297565b80601f016020809104026020016040519081016040528092919081815260200182805461360190614297565b801561364e5780601f106136235761010080835404028352916020019161364e565b820191906000526020600020905b81548152906001019060200180831161363157829003601f168201915b5050505050613880565b61373c6040518060400160405280600681526020017f46696c74657200000000000000000000000000000000000000000000000000008152506101268c60e0015160ff16600381106136ad576136ac6142c8565b5b0180546136b990614297565b80601f01602080910402602001604051908101604052809291908181526020018280546136e590614297565b80156137325780601f1061370757610100808354040283529160200191613732565b820191906000526020600020905b81548152906001019060200180831161371557829003601f168201915b5050505050613880565b6138216040518060400160405280600781526020017f4c6963656e7365000000000000000000000000000000000000000000000000008152506101298d610100015160ff1660038110613792576137916142c8565b5b01805461379e90614297565b80601f01602080910402602001604051908101604052809291908181526020018280546137ca90614297565b80156138175780601f106137ec57610100808354040283529160200191613817565b820191906000526020600020905b8154815290600101906020018083116137fa57829003601f168201915b5050505050613880565b6040516020016138399998979695949392919061585d565b604051602081830303815290604052915050919050565b60008261385d85846138ac565b1490509392505050565b60009392505050565b60006001821460e11b9050919050565b606082826040516020016138959291906159be565b604051602081830303815290604052905092915050565b60008082905060005b84518110156138f7576138e2828683815181106138d5576138d46142c8565b5b6020026020010151613902565b915080806138ef90615a0f565b9150506138b5565b508091505092915050565b600081831061391a57613915828461392d565b613925565b613924838361392d565b5b905092915050565b600082600052816020526040600020905092915050565b604051806101400160405280600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6139fd816139c8565b8114613a0857600080fd5b50565b600081359050613a1a816139f4565b92915050565b600060208284031215613a3657613a356139be565b5b6000613a4484828501613a0b565b91505092915050565b60008115159050919050565b613a6281613a4d565b82525050565b6000602082019050613a7d6000830184613a59565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613abd578082015181840152602081019050613aa2565b60008484015250505050565b6000601f19601f8301169050919050565b6000613ae582613a83565b613aef8185613a8e565b9350613aff818560208601613a9f565b613b0881613ac9565b840191505092915050565b60006020820190508181036000830152613b2d8184613ada565b905092915050565b6000819050919050565b613b4881613b35565b8114613b5357600080fd5b50565b600081359050613b6581613b3f565b92915050565b600060208284031215613b8157613b806139be565b5b6000613b8f84828501613b56565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613bc382613b98565b9050919050565b613bd381613bb8565b82525050565b6000602082019050613bee6000830184613bca565b92915050565b613bfd81613bb8565b8114613c0857600080fd5b50565b600081359050613c1a81613bf4565b92915050565b60008060408385031215613c3757613c366139be565b5b6000613c4585828601613c0b565b9250506020613c5685828601613b56565b9150509250929050565b600060ff82169050919050565b613c7681613c60565b8114613c8157600080fd5b50565b600081359050613c9381613c6d565b92915050565b60008060408385031215613cb057613caf6139be565b5b6000613cbe85828601613b56565b9250506020613ccf85828601613c84565b9150509250929050565b613ce281613b35565b82525050565b6000602082019050613cfd6000830184613cd9565b92915050565b600080600060608486031215613d1c57613d1b6139be565b5b6000613d2a86828701613c0b565b9350506020613d3b86828701613c0b565b9250506040613d4c86828701613b56565b9150509250925092565b6000819050919050565b613d6981613d56565b82525050565b6000602082019050613d846000830184613d60565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613daf57613dae613d8a565b5b8235905067ffffffffffffffff811115613dcc57613dcb613d8f565b5b602083019150836001820283011115613de857613de7613d94565b5b9250929050565b60008060208385031215613e0657613e056139be565b5b600083013567ffffffffffffffff811115613e2457613e236139c3565b5b613e3085828601613d99565b92509250509250929050565b600060208284031215613e5257613e516139be565b5b6000613e6084828501613c0b565b91505092915050565b600061ffff82169050919050565b613e8081613e69565b8114613e8b57600080fd5b50565b600081359050613e9d81613e77565b92915050565b600060208284031215613eb957613eb86139be565b5b6000613ec784828501613e8e565b91505092915050565b613ed981613d56565b8114613ee457600080fd5b50565b600081359050613ef681613ed0565b92915050565b600060208284031215613f1257613f116139be565b5b6000613f2084828501613ee7565b91505092915050565b613f3281613a4d565b8114613f3d57600080fd5b50565b600081359050613f4f81613f29565b92915050565b60008060408385031215613f6c57613f6b6139be565b5b6000613f7a85828601613c0b565b9250506020613f8b85828601613f40565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613fd282613ac9565b810181811067ffffffffffffffff82111715613ff157613ff0613f9a565b5b80604052505050565b60006140046139b4565b90506140108282613fc9565b919050565b600067ffffffffffffffff8211156140305761402f613f9a565b5b61403982613ac9565b9050602081019050919050565b82818337600083830152505050565b600061406861406384614015565b613ffa565b90508281526020810184848401111561408457614083613f95565b5b61408f848285614046565b509392505050565b600082601f8301126140ac576140ab613d8a565b5b81356140bc848260208601614055565b91505092915050565b600080600080608085870312156140df576140de6139be565b5b60006140ed87828801613c0b565b94505060206140fe87828801613c0b565b935050604061410f87828801613b56565b925050606085013567ffffffffffffffff8111156141305761412f6139c3565b5b61413c87828801614097565b91505092959194509250565b61415181613e69565b82525050565b600060208201905061416c6000830184614148565b92915050565b60008060408385031215614189576141886139be565b5b600061419785828601613c0b565b92505060206141a885828601613c0b565b9150509250929050565b60008083601f8401126141c8576141c7613d8a565b5b8235905067ffffffffffffffff8111156141e5576141e4613d8f565b5b60208301915083602082028301111561420157614200613d94565b5b9250929050565b600080600060408486031215614221576142206139be565b5b600061422f86828701613b56565b935050602084013567ffffffffffffffff8111156142505761424f6139c3565b5b61425c868287016141b2565b92509250509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806142af57607f821691505b6020821081036142c2576142c1614268565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061433182613c60565b915061433c83613c60565b92508261434c5761434b6142f7565b5b828206905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061438d602083613a8e565b915061439882614357565b602082019050919050565b600060208201905081810360008301526143bc81614380565b9050919050565b600081905092915050565b50565b60006143de6000836143c3565b91506143e9826143ce565b600082019050919050565b60006143ff826143d1565b9150819050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026144767fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614439565b6144808683614439565b95508019841693508086168417925050509392505050565b6000819050919050565b60006144bd6144b86144b384613b35565b614498565b613b35565b9050919050565b6000819050919050565b6144d7836144a2565b6144eb6144e3826144c4565b848454614446565b825550505050565b600090565b6145006144f3565b61450b8184846144ce565b505050565b5b8181101561452f576145246000826144f8565b600181019050614511565b5050565b601f8211156145745761454581614414565b61454e84614429565b8101602085101561455d578190505b61457161456985614429565b830182614510565b50505b505050565b600082821c905092915050565b600061459760001984600802614579565b1980831691505092915050565b60006145b08383614586565b9150826002028217905092915050565b6145ca8383614409565b67ffffffffffffffff8111156145e3576145e2613f9a565b5b6145ed8254614297565b6145f8828285614533565b6000601f8311600181146146275760008415614615578287013590505b61461f85826145a4565b865550614687565b601f19841661463586614414565b60005b8281101561465d57848901358255600182019150602085019450602081019050614638565b8683101561467a5784890135614676601f891682614586565b8355505b6001600288020188555050505b50505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006146ca82613b35565b91506146d583613b35565b92508282019050808211156146ed576146ec614690565b5b92915050565b60006146fe82613b35565b915061470983613b35565b925082820261471781613b35565b9150828204841483151761472e5761472d614690565b5b5092915050565b600081905092915050565b6000815461474d81614297565b6147578186614735565b945060018216600081146147725760018114614787576147ba565b60ff19831686528115158202860193506147ba565b61479085614414565b60005b838110156147b257815481890152600182019150602081019050614793565b838801955050505b50505092915050565b60006147ce82613a83565b6147d88185614735565b93506147e8818560208601613a9f565b80840191505092915050565b7f2e706e6700000000000000000000000000000000000000000000000000000000815250565b60006148268285614740565b915061483282846147c3565b915061483d826147f4565b6004820191508190509392505050565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000815250565b600061487e8261484d565b601a8201915061488e82846147c3565b915081905092915050565b7f7b226e616d65223a22436875626c696e20230000000000000000000000000000815250565b7f222c20226465736372697074696f6e223a224120436875626c696e20626f726e60008201527f206f662074686520626c6f636b636861696e2e222c226174747269627574657360208201527f223a000000000000000000000000000000000000000000000000000000000000604082015250565b6000614941604283614735565b915061494c826148bf565b604282019050919050565b7f2c2022696d616765223a22000000000000000000000000000000000000000000815250565b7f227d000000000000000000000000000000000000000000000000000000000000815250565b60006149ae82614899565b6012820191506149be82866147c3565b91506149c982614934565b91506149d582856147c3565b91506149e082614957565b600b820191506149f082846147c3565b91506149fb8261497d565b600282019150819050949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815250565b6000614a3d82614a0c565b601d82019150614a4d82846147c3565b915081905092915050565b60008160601b9050919050565b6000614a7082614a58565b9050919050565b6000614a8282614a65565b9050919050565b614a9a614a9582613bb8565b614a77565b82525050565b6000614aac8284614a89565b60148201915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614b17602683613a8e565b9150614b2282614abb565b604082019050919050565b60006020820190508181036000830152614b4681614b0a565b9050919050565b6000819050919050565b614b68614b6382613b35565b614b4d565b82525050565b7f3100000000000000000000000000000000000000000000000000000000000000600082015250565b6000614ba4600183614735565b9150614baf82614b6e565b600182019050919050565b6000614bc68285614b57565b602082019150614bd68284614a89565b601482019150614be582614b97565b91508190509392505050565b6000614bfc82613b35565b9150614c0783613b35565b925082614c1757614c166142f7565b5b828206905092915050565b7f3200000000000000000000000000000000000000000000000000000000000000600082015250565b6000614c58600183614735565b9150614c6382614c22565b600182019050919050565b6000614c7a8285614b57565b602082019150614c8a8284614a89565b601482019150614c9982614c4b565b91508190509392505050565b7f3300000000000000000000000000000000000000000000000000000000000000600082015250565b6000614cdb600183614735565b9150614ce682614ca5565b600182019050919050565b6000614cfd8285614b57565b602082019150614d0d8284614a89565b601482019150614d1c82614cce565b91508190509392505050565b7f3400000000000000000000000000000000000000000000000000000000000000600082015250565b6000614d5e600183614735565b9150614d6982614d28565b600182019050919050565b6000614d808285614b57565b602082019150614d908284614a89565b601482019150614d9f82614d51565b91508190509392505050565b7f3500000000000000000000000000000000000000000000000000000000000000600082015250565b6000614de1600183614735565b9150614dec82614dab565b600182019050919050565b6000614e038285614b57565b602082019150614e138284614a89565b601482019150614e2282614dd4565b91508190509392505050565b7f3600000000000000000000000000000000000000000000000000000000000000600082015250565b6000614e64600183614735565b9150614e6f82614e2e565b600182019050919050565b6000614e868285614b57565b602082019150614e968284614a89565b601482019150614ea582614e57565b91508190509392505050565b7f3700000000000000000000000000000000000000000000000000000000000000600082015250565b6000614ee7600183614735565b9150614ef282614eb1565b600182019050919050565b6000614f098285614b57565b602082019150614f198284614a89565b601482019150614f2882614eda565b91508190509392505050565b7f3800000000000000000000000000000000000000000000000000000000000000600082015250565b6000614f6a600183614735565b9150614f7582614f34565b600182019050919050565b6000614f8c8285614b57565b602082019150614f9c8284614a89565b601482019150614fab82614f5d565b91508190509392505050565b7f3900000000000000000000000000000000000000000000000000000000000000600082015250565b6000614fed600183614735565b9150614ff882614fb7565b600182019050919050565b600061500f8285614b57565b60208201915061501f8284614a89565b60148201915061502e82614fe0565b91508190509392505050565b7f2066696c7465723d2775726c2823000000000000000000000000000000000000815250565b7f2927000000000000000000000000000000000000000000000000000000000000815250565b60006150918261503a565b600e820191506150a18284614740565b91506150ac82615060565b60028201915081905092915050565b7f3c66696c7465722069643d220000000000000000000000000000000000000000815250565b7f2220783d222d3530252220793d222d353025222077696474683d22323030252260008201527f206865696768743d2232303025223e0000000000000000000000000000000000602082015250565b600061513d602f83614735565b9150615148826150e1565b602f82019050919050565b7f3c2f66696c7465723e0000000000000000000000000000000000000000000000815250565b6000615184826150bb565b600c820191506151948285614740565b915061519f82615130565b91506151ab8284614740565b91506151b682615153565b6009820191508190509392505050565b7f3c66696c74657220783d22302220793d2230222077696474683d22313030252260008201527f206865696768743d2231303025222069643d22666267223e3c6665547572627560208201527f6c656e636520626173654672657175656e63793d22302e3030323420302e303060408201527f333622206e756d4f6374617665733d2231362220736565643d223138222f3e3c60608201527f2f66696c7465723e000000000000000000000000000000000000000000000000608082015250565b6000615294608883614735565b915061529f826151c6565b608882019050919050565b60006152b682846147c3565b91506152c182615287565b915081905092915050565b7f3c2f646566733e3c7061746820643d274d30203048363030563630304830272060008201527f66696c6c3d272300000000000000000000000000000000000000000000000000602082015250565b6000615328602783614735565b9150615333826152cc565b602782019050919050565b7f272f3e0000000000000000000000000000000000000000000000000000000000815250565b7f3c672069643d27636875622720637572736f723d27706f696e74657227000000815250565b7f3e3c672066696c6c3d2723666666273e3c656c6c697073652063783d2733303060008201527f272063793d27343630272072783d27313630272072793d273530272f3e3c706160208201527f746820643d274d313430203134306833323076333230483134307a272f3e3c2f60408201527f673e3c656c6c697073652063783d27333030272063793d27313430272072783d60608201527f27313630272072793d273530272066696c6c3d2723463846344634272f3e3c6760808201527f2069643d276661636527207472616e73666f726d3d27726f74617465282d352060a08201527f333432322e333335202d323831392e343929273e00000000000000000000000060c082015250565b60006154a460d483614735565b91506154af8261538a565b60d482019050919050565b60006154c682886147c3565b91506154d282876147c3565b91506154dd8261531b565b91506154e98286614740565b91506154f48261533e565b60038201915061550482856147c3565b915061550f82615364565b601d8201915061551f82846147c3565b915061552a82615497565b91508190509695505050505050565b7f3c2f673e3c616e696d6174654d6f74696f6e20706174683d274d302c30202d3360008201527f2c2d3920302c2d313820362c2d3920322c3020302c347a27206b6579506f696e60208201527f74733d27303b302e313837353b302e3337353b302e353632353b302e37353b3060408201527f2e393b3127206b657954696d65733d27303b302e31383b302e33373b302e353860608201527f3b302e37323b302e38373b3127206475723d27302e36732720626567696e3d2760808201527f636c69636b272f3e3c2f673e3c2f7376673e000000000000000000000000000060a082015250565b600061562d60b283614735565b915061563882615539565b60b282019050919050565b600061564f828a6147c3565b915061565b8289614740565b91506156678288614740565b91506156738287614740565b915061567f8286614740565b915061568b8285614740565b91506156978284614740565b91506156a282615620565b915081905098975050505050505050565b600081519050919050565b600082825260208201905092915050565b60006156da826156b3565b6156e481856156be565b93506156f4818560208601613a9f565b6156fd81613ac9565b840191505092915050565b600060808201905061571d6000830187613bca565b61572a6020830186613bca565b6157376040830185613cd9565b818103606083015261574981846156cf565b905095945050505050565b600081519050615763816139f4565b92915050565b60006020828403121561577f5761577e6139be565b5b600061578d84828501615754565b91505092915050565b60006157a182613b35565b91506157ac83613b35565b9250826157bc576157bb6142f7565b5b828204905092915050565b60006157d38285614740565b91506157df82846147c3565b91508190509392505050565b7f5b00000000000000000000000000000000000000000000000000000000000000815250565b7f2c00000000000000000000000000000000000000000000000000000000000000815250565b7f5d00000000000000000000000000000000000000000000000000000000000000815250565b6000615868826157eb565b600182019150615878828c6147c3565b915061588382615811565b600182019150615893828b6147c3565b915061589e82615811565b6001820191506158ae828a6147c3565b91506158b982615811565b6001820191506158c982896147c3565b91506158d482615811565b6001820191506158e482886147c3565b91506158ef82615811565b6001820191506158ff82876147c3565b915061590a82615811565b60018201915061591a82866147c3565b915061592582615811565b60018201915061593582856147c3565b915061594082615811565b60018201915061595082846147c3565b915061595b82615837565b6001820191508190509a9950505050505050505050565b7f7b2274726169745f74797065223a220000000000000000000000000000000000815250565b7f222c2276616c7565223a22000000000000000000000000000000000000000000815250565b60006159c982615972565b600f820191506159d982856147c3565b91506159e482615998565b600b820191506159f482846147c3565b91506159ff8261497d565b6002820191508190509392505050565b6000615a1a82613b35565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615a4c57615a4b614690565b5b60018201905091905056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c7061746820643d224d30203048363030563630304830222066696c7465723d2275726c282366626729222f3e3c7376672077696474683d2736303027206865696768743d27363030272076696577426f783d2730203020363030203630302720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f7376672720786d6c6e733a786c696e6b3d27687474703a2f2f7777772e77332e6f72672f313939392f786c696e6b273e3c7374796c653e2e6c6e66742c2e6c6e72747b7374726f6b653a233030303b7374726f6b652d6c696e656361703a726f756e647d2e6c6e66747b66696c6c3a677261793b7374726f6b652d77696474683a383b7d2e6c6e72747b66696c6c3a6e6f6e653b7374726f6b652d77696474683a373b7374726f6b652d6c696e656a6f696e3a62657a656c7d2e74687b7374726f6b652d77696474683a31327d2e746e7b7374726f6b652d77696474683a347d2e776c72747b7374726f6b653a236666663b7374726f6b652d77696474683a337d746578747b666f6e742d66616d696c793a27436f6d69632053616e73204d53272c27436f6d69632053616e73272c274368616c6b626f617264205345272c27436f6d6963204e657565272c637572736976653b666f6e742d73697a653a313270747d3c2f7374796c653e3c646566733ea264697066735822122012f333c9a99c28a9700cc3bc139a4067b8da2210a8b05160ecf4c9741878ac4b64736f6c634300081100333c7061746820643d224d32392c3130352061312c31203020302c302034302c304d37302c3130352061312c31203020302c302034302c302220636c6173733d226c6e7274222f3e3c7061746820636c6173733d226c6e72742220643d226d2d36202d31362034302032346d302030202d34302032346d3135322030202d3430202d32346d302030203430202d3234222f3e3c636972636c652063783d223130222063793d2231302220723d223130222f3e3c636972636c652063783d22313330222063793d2231302220723d223130222f3e3c7061746820643d224d33392c3130302061312c302e39203020302c302036302c302220636c6173733d226c6e7274222f3e3c706174682069643d226579652220636c6173733d226c6e667422207374796c653d2266696c6c3a233030303b7374726f6b652d6c696e656a6f696e3a726f756e642220643d224d31302e342d313876392e36562d31382e317a6d2d31372e3720372e3720362e3220372e332d362e322d372e337a6d33352e3320302d362e3220372e3320362e322d372e337a4d31302e342d332e38432e39352d342e322d352e3720372e342d2e36352031352e3363342e3320382e342031372e3720382e34203232203020342e362d372e322d2e34342d31372e372d382e382d31382e392d312e312d2e31357a222f3e3c75736520786c696e6b3a687265663d222365796522207472616e73666f726d3d227472616e736c6174652831323029222f3e3c70617468207374726f6b653d22233030302220636c6173733d2274682220643d224d2d352d33302034342d366d363320302034382d3234222f3e3c636972636c652063783d223232222063793d2231322220723d223133222f3e3c636972636c652063783d22313237222063793d2231322220723d223133222f3e3c672069643d22657965223e3c636972636c652063783d223130222063793d2231302220723d223330222f3e3c636972636c652063783d223130222063793d2231302220723d2232342220636c6173733d22776c7274222f3e3c2f673e3c75736520786c696e6b3a687265663d222365796522207472616e73666f726d3d227472616e736c6174652831323029222f3e3c656c6c697073652063783d223632222063793d222d313238222072783d223530222072793d223135222f3e3c7061746820643d224d32372c2d3133302061312c31203020302c312037302c30222f3e3c7061746820643d224d32372c2d3133302061362c31203020312c302037302c3022207374726f6b653d226772617922207374726f6b652d77696474683d2232222f3e3c706174682069643d2263686b222066696c6c3d22236661662220643d224d2d392e35203234632e362d332e3920352d332e3920362e382d312e3620312e392d322e3320362e332d322e3220362e3820312e362e3520332e342d3420362e322d362e3820382e312d322e382d312e382d372e342d342e362d362e382d382e317a22207472616e73666f726d3d226d617472697828322030203020322e342030203029222f3e3c75736520786c696e6b3a687265663d222363686b22207472616e73666f726d3d227472616e736c6174652831343829222f3e3c7061746820643d226d36322d31343620342d35382d34302d32302220636c6173733d226c6e7274222f3e3c636972636c652063783d223236222063793d222d3232342220723d223134222f3e3c6720636c6173733d226c6e7274223e3c7061746820643d224d3430203130204131302031302031302031302030203133203130222f3e3c7061746820643d224d3134302031312041313020313020313020313020313030203132203130222f3e3c2f673e3c672069643d22657965223e3c636972636c652063783d223130222063793d2231302220723d223330222f3e3c636972636c652063783d223235222063793d22352220723d2238222066696c6c3d2223666666222f3e3c636972636c652063783d222d38222063793d2232302220723d2234222066696c6c3d2223666666222f3e3c2f673e3c75736520786c696e6b3a687265663d222365796522207472616e73666f726d3d227472616e736c6174652831323029222f3e3c7061746820643d224d2d3939202d3132346131202e3920302030203020363020302220636c6173733d226c6e727422207472616e73666f726d3d22726f746174652831383029222f3e3c6720636c6173733d226c6e727420746e22207472616e73666f726d3d226d6174726978282e3339383738202d2e3031333937202e303335202e34202d313530202d31353829223e3c636c6970506174682069643d22636c70223e3c7061746820643d224d32323020313930683330763534682d33307a222f3e3c2f636c6970506174683e3c656c6c697073652069643d2262222063783d22323530222063793d22323137222072783d223235222072793d223237222066696c6c3d2223663862222f3e3c757365207472616e73666f726d3d22726f746174652836302032353020323530292220786c696e6b3a687265663d222362222f3e3c757365207472616e73666f726d3d22726f74617465283132302032353020323530292220786c696e6b3a687265663d222362222f3e3c757365207472616e73666f726d3d22726f74617465283138302032353020323530292220786c696e6b3a687265663d222362222f3e3c757365207472616e73666f726d3d22726f74617465283234302032353020323530292220786c696e6b3a687265663d222362222f3e3c757365207472616e73666f726d3d22726f74617465283330302032353020323530292220786c696e6b3a687265663d222362222f3e3c75736520786c696e6b3a687265663d2223622220636c69702d706174683d2275726c2823636c7029222f3e3c636972636c652063783d22323530222063793d223235302220723d223138222066696c6c3d2223666463222f3e3c2f673e3c7061746820643d226d3339203131362036312d302220636c6173733d226c6e7274222f3e3c706174682069643d226579652220643d224d31332e332033362e33432d312e372033382e342d31332031392e342d3420372e3263352d382e392032312d31322e342032352e372d312e3320332e3720372e342d332e362031372e392d31312e392031352e372d342d312e362d322e382d382e3120312e342d382e3320352e342d312e332e33382d382e372d332e352d342e3943312e312031302e382d2e33352032302e3520342e39203235633420332e392031302e3420332e312031342e382e344333312e352031392e332033312e312d2e312031382e342d352e3220332d31322d31342e3920332e372d31322e372031392e37632e3720352e352d382e3420362e332d382e372e382d322e372d32312e322031392e352d34312e342034302e332d33342e394333372e312d392e362034332e312031352e382032392e382032382e35632d342e3320342e352d31302e3220372e332d31362e3420372e385a222f3e3c75736520786c696e6b3a687265663d222365796522207472616e73666f726d3d22726f746174652831383020373020313029222f3e3c7061746820643d224d33392c3130302061312c31203020302c302036302c30222f3e3c7061746820643d224d2d3132202d3533632d332e372d322e312d362e312d362e322d362e312d31302e3620302d342e3420322e332d382e3520362e312d31302e376d2d33372e37203063332e3720322e3120362e3120362e3220362e312031302e36203020342e342d322e3320382e352d362e312031302e376d382e3220382e3263322e312d332e3720362e322d362e312031302e362d362e3120342e34203020382e3520322e332031302e3720362e316d302d33372e37632d322e3120332e372d362e3220362e312d31302e3620362e312d342e3420302d382e352d322e332d31302e372d362e312220636c6173733d226c6e727420746e222f3e3c706174682069643d2261632220643d226d36302c3638632d31322e342c302e39202d31322e332c31332e37202d32392e332c31322e3320372e332c31332e352032342e342c31332e342033342e332c362e3820392e382c2d362e3720342e382c2d31392e37202d352c2d31397a222f3e3c75736520786c696e6b3a687265663d2223616322207472616e73666f726d3d227363616c65282d312c31292c7472616e736c617465282d31333929222f3e3c7061746820643d224d31302e322d31372e38632d372e352d2e31372d31342e3820322d32312e3420352e362d362e3820332e342d31322e3620382e382d31362e312031352e362d312e3620332e312e3720362e3320312e3820392e3220322e3820352e3220352e372031302e372031302e362031342e332032202e382d2e392d332e352d312e322d342e372d322e342d342e392d342e332d31302d352e362d31352e3220332e382d3520372e382d31302031332e332d31332e3220312e352d312e3320342e342d322e3420322e392e372d332e312031312e322d322e352032342e3220342e33203334202e38203220352e3220342e33203420362e312d322e322e362d312e3620312e352e3320312e3220382e392d2e322031372e372d2e352032362e392d312e3320332e332d2e382d322e392d2e392d332e372d312e3420322e342d332e3620352e332d3720362e362d31312e3220332e322d382e3520332e352d31372e3920312e322d32362e3620322e322d2e3320352e3220322e3820372e3520342e3120312e372e3620342e3720342e3820352e3720332e322d332e342d392d31322e322d31342e352d32322e382d31372e372d352e312d322d31302e372d322e352d31362e312d322e355a4d342e3820362e36632d2e3520352e3420312e382031322e3120372e342031332e3820342e3920312e3420392e332d332031302e352d372e3420312e352d322e342d312d372e3720332e332d362e3220322e392e3320372e352e3720362e3520342e392d2e3720362e362d332e332031332d372e372031382d31202e392d312e3920322e312d3320322e386c2d31342e392e37632d332e342d332e322d362e352d362e372d382e332d31312d312e372d342d332e322d382e332d322e392d31322e3720312e322d332e3320362e352d312e3720392e322d335a222069643d22657965222f3e3c75736520786c696e6b3a687265663d222365796522207472616e73666f726d3d226d6174726978282d3120302030203120313432203029222f3e3c7061746820643d224d333520313237632d352e322d352e382d352e352d31352e362d2e362d32322e3520342e352d362e332031302e332d362e342032322e322d2e332031312e3420352e392031352e3920352e392032352e382e303220392e362d352e372031352e312d362031392e362d31203520352e3620362031322e3720322e392032302e312d332e3820392d392031302d323120332e392d31322e332d362d31372d362d32382e372d2e322d31312e3320352e392d31342e3620352e392d31392e382e30377a222f3e3c7061746820636c6173733d226c6e72742220643d224d2d3520306835304d39302030683530222f3e3c636972636c652063783d223238222063793d2231322220723d223133222f3e3c636972636c652063783d22313233222063793d2231322220723d223133222f3e3c7061746820643d226d302d31382034322034324d302032346c34322d34326d353420302034322034326d2d343220302034322d34322220636c6173733d226c6e7274222f3e3c7061746820643d224d33392c3130302061312c31203020302c302036302c30222f3e3c706174682066696c6c3d22236666662220643d224d353820313033483638563131364835384d37302031303348383056313136483730222f3e3c672066696c6c3d2270696e6b223e3c656c6c697073652063783d223130222063793d223630222072783d223230222072793d223130222f3e3c656c6c697073652063783d22313330222063793d223630222072783d223230222072793d223130222f3e3c2f673e3c666554757262756c656e636520626173654672657175656e63793d22302220747970653d226672616374616c4e6f697365222073746974636854696c65733d226e6f537469746368223e3c616e696d6174652069643d2277767922206174747269627574654e616d653d22626173654672657175656e637922206475723d2236732220626567696e3d22312e35733b7776792e656e642b312e3573222076616c7565733d22303b302e30333b3022206b657954696d65733d22303b302e353b312220656173696e673d22656173652d696e2d6f7574222f3e3c2f666554757262756c656e63653e3c6665446973706c6163656d656e744d617020696e3d22536f757263654772617068696322207363616c653d223134222f3e3c7061746820643d224d36362c3132302061302e362c302e36203020302c3020302c2d32304d36362c3134302061312e322c31203020302c3020302c2d32302220636c6173733d226c6e727420746e222f3e3c672066696c6c3d2223663333323263223e3c7061746820643d224d2d3432202d334839365637482d3332563231482d3432222f3e3c672069643d22657965223e3c706174682066696c6c3d22236666662220643d224d2d3130202d3233483430563237482d31307a22207374726f6b653d222366333332326322207374726f6b652d77696474683d223130222f3e3c706174682066696c6c3d22233030302220643d224d3135202d31384833355632324831357a222f3e3c2f673e3c75736520786c696e6b3a687265663d22236579652220783d22313038222f3e3c2f673e3c6720636c6173733d226c6e7274223e3c7061746820643d224d36302c3132382061302e332c302e35203020302c302032382c2d33222066696c6c3d2270696e6b2220636c6173733d22746e222f3e3c7061746820643d224d33362c3131302061302e39392c302e35203020302c302036352c30222f3e3c2f673e3c7061746820643d226d313520362031302031326131322e382031322e382030203120312d323020304c313520367a222066696c6c3d226e6f6e6522207374726f6b653d22626c61636b22207374726f6b652d77696474683d223322207472616e73666f726d3d22726f746174652835202d3433322e313732202d38372e37313129222f3e3c656c6c697073652063783d223639222063793d22313134222072783d223138222072793d223234222f3e3c7061746820643d226d322e352031302e3820312e352e352e3420312e362e342d312e3620312e352d2e352d312e352d2e352d2e342d312e352d2e3420312e357a4d2e3520332e356c322e312e372e3620322e322e362d322e3220322e312d2e372d322e312d2e374c332e322e376c2d2e3620322e327a6d382e312d324c372e3620352e336c2d322e3620312e3120322e3620312e31203120332e384c392e3720372e346c322e352d312e312d322e352d312e317a222066696c6c3d222366666335303222207472616e73666f726d3d226d617472697828342e352030203020342e35202d3932202d363829222f3e3c7061746820643d226d3237203132302031342d31302031342031302031342d31302031342031302031342d31302031342031302220636c6173733d226c6e7274222f3e3c7061746820643d224d2d34382c2d3134322061302e392c31203020302c312036302c2d384d3131362c2d3134362061302e392c31203020302c312036302c31322220636c6173733d226c6e6674207468222f3e3c7061746820636c6173733d226c6e72742220643d226d2d31322031382032352d33366d3020302032352033366d363220302032352d33366d302030203235203336222f3e3c7061746820643d226d313520362031302031326131322e382031322e382030203120312d323020304c313520367a222066696c6c3d222338616622207472616e73666f726d3d22726f746174652835202d3433322e313732202d38372e37313129222f3e3c666554757262756c656e636520626173654672657175656e63793d22302e362220747970653d226672616374616c4e6f697365222f3e3c6665446973706c6163656d656e744d617020696e3d22536f757263654772617068696322207363616c653d2230223e3c616e696d6174652069643d22676c74636822206174747269627574654e616d653d227363616c6522206475723d22322e35732220626567696e3d22312e35733b676c7463682e656e642b332e3573222076616c7565733d2233362e373b35382e383b33362e393b31353b31332e333b34372e333b35382e323b32312e363b34362e353b34302e323b33352e383b33362e313b34322e373b33322e323b34362e363b33332e373b31372e333b35322e313b33302e383b34302e343b34343b33362e323b31362e323b32303b31352e373b35302e393b33302e38222f3e3c2f6665446973706c6163656d656e744d61703e3c7061746820643d224d2d3436202d313430202d3236202d313730202d36202d3134304d313234202d31333720313434202d31363720313634202d3133372220636c6173733d226c6e6674222f3e3c706174682066696c6c3d2272656422207374726f6b653d2272656422207374726f6b652d77696474683d223722207374726f6b652d6c696e656a6f696e3d22726f756e642220643d226d2d34342d38322032302031352032302d31357633306c2d32302d31352d32302031357a222f3e3c7265637420783d222d33342e352220793d222d37372e35222077696474683d22323122206865696768743d223231222072783d2234222066696c6c3d2272656422207374726f6b653d222366666622207374726f6b652d77696474683d2232222f3e3c7061746820643d224d3136202d313132613120312030203020312031303020304d3136202d31313261322e3520312e3520313820312030203130302030222f3e3c7061746820643d224d31372d31313268393922207374726f6b653d222330303022207374726f6b652d77696474683d2232222f3e3c7061746820643d224d31362d31313261353020362e323520302031203020313030203022207374726f6b653d222335353522207374726f6b652d77696474683d223222207374726f6b652d6c696e656361703d22726f756e64222f3e3c7465787420783d2235322220793d222d313137222066696c6c3d2223646464223e636875623c2f746578743e3c7265637420783d2232342220793d222d3138222077696474683d22313622206865696768743d223438222072793d2238222f3e3c7265637420783d223130302220793d222d3138222077696474683d22313622206865696768743d223438222072793d2238222f3e3c6720636c6173733d226c6e7274223e3c7061746820643d224d3337203130386131202e372030203020302036322030222f3e3c7061746820643d224d2d3331203130396131202e32203020302030203230203022207472616e73666f726d3d22726f74617465282d333029222f3e3c2f673e
Deployed Bytecode
0x60806040526004361061021a5760003560e01c80638da5cb5b11610123578063c87b56dd116100ab578063ec8bda8e1161006f578063ec8bda8e146107c2578063ed5e4e2b146107de578063f19e75d41461081b578063f2fde38b14610844578063faf021461461086d5761021a565b8063c87b56dd146106b5578063d5abeb01146106f2578063d697ef5d1461071d578063e05c57bf14610748578063e985e9c5146107855761021a565b8063a0712d68116100f2578063a0712d68146105df578063a22cb465146105fb578063a4435dfd14610624578063b2dd12121461064f578063b88d4fde1461068c5761021a565b80638da5cb5b1461052357806395d89b411461054e578063987222b5146105795780639bac5f7a146105a25761021a565b80632eb4a7ab116101a65780636352211e116101755780636352211e1461044057806370a082311461047d578063715018a6146104ba57806374ea7fc1146104d15780637cb64759146104fa5761021a565b80632eb4a7ab146103ac57806342842e0e146103d757806345f7e06e1461040057806355f804b3146104175761021a565b80630a85202e116101ed5780630a85202e146102ed5780630e87c9711461032a57806318160ddd1461034157806323b872dd1461036c57806324600fc3146103955761021a565b806301ffc9a71461021f57806306fdde031461025c578063081812fc14610287578063095ea7b3146102c4575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190613a20565b6108aa565b6040516102539190613a68565b60405180910390f35b34801561026857600080fd5b5061027161093c565b60405161027e9190613b13565b60405180910390f35b34801561029357600080fd5b506102ae60048036038101906102a99190613b6b565b6109ce565b6040516102bb9190613bd9565b60405180910390f35b3480156102d057600080fd5b506102eb60048036038101906102e69190613c20565b610a4d565b005b3480156102f957600080fd5b50610314600480360381019061030f9190613c99565b610b91565b6040516103219190613b13565b60405180910390f35b34801561033657600080fd5b5061033f610e42565b005b34801561034d57600080fd5b50610356610eea565b6040516103639190613ce8565b60405180910390f35b34801561037857600080fd5b50610393600480360381019061038e9190613d03565b610f01565b005b3480156103a157600080fd5b506103aa611223565b005b3480156103b857600080fd5b506103c1611318565b6040516103ce9190613d6f565b60405180910390f35b3480156103e357600080fd5b506103fe60048036038101906103f99190613d03565b61131e565b005b34801561040c57600080fd5b5061041561133e565b005b34801561042357600080fd5b5061043e60048036038101906104399190613def565b6113d7565b005b34801561044c57600080fd5b5061046760048036038101906104629190613b6b565b611469565b6040516104749190613bd9565b60405180910390f35b34801561048957600080fd5b506104a4600480360381019061049f9190613e3c565b61147b565b6040516104b19190613ce8565b60405180910390f35b3480156104c657600080fd5b506104cf611533565b005b3480156104dd57600080fd5b506104f860048036038101906104f39190613ea3565b6115bb565b005b34801561050657600080fd5b50610521600480360381019061051c9190613efc565b611657565b005b34801561052f57600080fd5b506105386116dd565b6040516105459190613bd9565b60405180910390f35b34801561055a57600080fd5b50610563611707565b6040516105709190613b13565b60405180910390f35b34801561058557600080fd5b506105a0600480360381019061059b9190613ea3565b611799565b005b3480156105ae57600080fd5b506105c960048036038101906105c49190613b6b565b611866565b6040516105d69190613b13565b60405180910390f35b6105f960048036038101906105f49190613b6b565b611892565b005b34801561060757600080fd5b50610622600480360381019061061d9190613f55565b611966565b005b34801561063057600080fd5b50610639611add565b6040516106469190613a68565b60405180910390f35b34801561065b57600080fd5b5061067660048036038101906106719190613b6b565b611af4565b6040516106839190613b13565b60405180910390f35b34801561069857600080fd5b506106b360048036038101906106ae91906140c5565b611bfb565b005b3480156106c157600080fd5b506106dc60048036038101906106d79190613b6b565b611c6e565b6040516106e99190613b13565b60405180910390f35b3480156106fe57600080fd5b50610707611d83565b6040516107149190614157565b60405180910390f35b34801561072957600080fd5b50610732611d9b565b60405161073f9190613a68565b60405180910390f35b34801561075457600080fd5b5061076f600480360381019061076a9190613b6b565b611db2565b60405161077c9190613b13565b60405180910390f35b34801561079157600080fd5b506107ac60048036038101906107a79190614172565b611dde565b6040516107b99190613a68565b60405180910390f35b6107dc60048036038101906107d79190614208565b611e72565b005b3480156107ea57600080fd5b5061080560048036038101906108009190613b6b565b611f75565b6040516108129190613a68565b60405180910390f35b34801561082757600080fd5b50610842600480360381019061083d9190613b6b565b61206d565b005b34801561085057600080fd5b5061086b60048036038101906108669190613e3c565b612120565b005b34801561087957600080fd5b50610894600480360381019061088f9190613b6b565b612217565b6040516108a19190613a68565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061090557506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109355750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461094b90614297565b80601f016020809104026020016040519081016040528092919081815260200182805461097790614297565b80156109c45780601f10610999576101008083540402835291602001916109c4565b820191906000526020600020905b8154815290600101906020018083116109a757829003601f168201915b5050505050905090565b60006109d982612263565b610a0f576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a5882611469565b90508073ffffffffffffffffffffffffffffffffffffffff16610a796122c2565b73ffffffffffffffffffffffffffffffffffffffff1614610adc57610aa581610aa06122c2565b611dde565b610adb576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60603373ffffffffffffffffffffffffffffffffffffffff16610bb384611469565b73ffffffffffffffffffffffffffffffffffffffff1614610bd357600080fd5b60018260ff161480610be8575060028260ff16145b610bf157600080fd5b6000600a600d856115b48110610c0a57610c096142c8565b5b602091828204019190069054906101000a900460ff16610c2a9190614326565b905060008160ff1603610d295782600d856115b48110610c4d57610c4c6142c8565b5b602091828204019190068282829054906101000a900460ff160192506101000a81548160ff021916908360ff1602179055506101298360ff1660038110610c9757610c966142c8565b5b018054610ca390614297565b80601f0160208091040260200160405190810160405280929190818152602001828054610ccf90614297565b8015610d1c5780601f10610cf157610100808354040283529160200191610d1c565b820191906000526020600020905b815481529060010190602001808311610cff57829003601f168201915b5050505050915050610e3c565b60018160ff16148015610d3f575060028360ff16145b15610e37576001600d856115b48110610d5b57610d5a6142c8565b5b602091828204019190068282829054906101000a900460ff160192506101000a81548160ff021916908360ff1602179055506101298360ff1660038110610da557610da46142c8565b5b018054610db190614297565b80601f0160208091040260200160405190810160405280929190818152602001828054610ddd90614297565b8015610e2a5780601f10610dff57610100808354040283529160200191610e2a565b820191906000526020600020905b815481529060010190602001808311610e0d57829003601f168201915b5050505050915050610e3c565b600080fd5b92915050565b610e4a6122ca565b73ffffffffffffffffffffffffffffffffffffffff16610e686116dd565b73ffffffffffffffffffffffffffffffffffffffff1614610ebe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb5906143a3565b60405180910390fd5b600a60059054906101000a900460ff1615600a60056101000a81548160ff021916908315150217905550565b6000610ef46122d2565b6001546000540303905090565b6000610f0c826122d7565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f73576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610f7f846123a3565b91509150610f958187610f906122c2565b6123ca565b610fe157610faa86610fa56122c2565b611dde565b610fe0576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611047576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611054868686600161240e565b801561105f57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061112d85611109888887612414565b7c02000000000000000000000000000000000000000000000000000000001761243c565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036111b357600060018501905060006004600083815260200190815260200160002054036111b15760005481146111b0578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461121b8686866001612467565b505050505050565b61122b6122ca565b73ffffffffffffffffffffffffffffffffffffffff166112496116dd565b73ffffffffffffffffffffffffffffffffffffffff161461129f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611296906143a3565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16476040516112c5906143f4565b60006040518083038185875af1925050503d8060008114611302576040519150601f19603f3d011682016040523d82523d6000602084013e611307565b606091505b505090508061131557600080fd5b50565b600b5481565b61133983838360405180602001604052806000815250611bfb565b505050565b6113466122ca565b73ffffffffffffffffffffffffffffffffffffffff166113646116dd565b73ffffffffffffffffffffffffffffffffffffffff16146113ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b1906143a3565b60405180910390fd5b6001600a60046101000a81548160ff021916908315150217905550565b6113df6122ca565b73ffffffffffffffffffffffffffffffffffffffff166113fd6116dd565b73ffffffffffffffffffffffffffffffffffffffff1614611453576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144a906143a3565b60405180910390fd5b8181600c91826114649291906145c0565b505050565b6000611474826122d7565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114e2576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61153b6122ca565b73ffffffffffffffffffffffffffffffffffffffff166115596116dd565b73ffffffffffffffffffffffffffffffffffffffff16146115af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a6906143a3565b60405180910390fd5b6115b9600061246d565b565b6115c36122ca565b73ffffffffffffffffffffffffffffffffffffffff166115e16116dd565b73ffffffffffffffffffffffffffffffffffffffff1614611637576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162e906143a3565b60405180910390fd5b80600a60026101000a81548161ffff021916908361ffff16021790555050565b61165f6122ca565b73ffffffffffffffffffffffffffffffffffffffff1661167d6116dd565b73ffffffffffffffffffffffffffffffffffffffff16146116d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ca906143a3565b60405180910390fd5b80600b8190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461171690614297565b80601f016020809104026020016040519081016040528092919081815260200182805461174290614297565b801561178f5780601f106117645761010080835404028352916020019161178f565b820191906000526020600020905b81548152906001019060200180831161177257829003601f168201915b5050505050905090565b6117a16122ca565b73ffffffffffffffffffffffffffffffffffffffff166117bf6116dd565b73ffffffffffffffffffffffffffffffffffffffff1614611815576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180c906143a3565b60405180910390fd5b8061ffff16611822610eea565b10801561183d5750611832611d83565b61ffff168161ffff16105b61184657600080fd5b80600a60006101000a81548161ffff021916908361ffff16021790555050565b606061187182612263565b61187a57600080fd5b61188b61188683612533565b6128ad565b9050919050565b600a60049054906101000a900460ff1680156118cb5750806118b2610eea565b6118bc91906146bf565b6118c4611d83565b61ffff1610155b6118d457600080fd5b600a60029054906101000a900461ffff1661ffff16816118f333612b1e565b6118fd91906146bf565b111561190857600080fd5b8060095461191691906146f3565b341461192157600080fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461195957600080fd5b6119633382612b75565b50565b61196e6122c2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119d2576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006119df6122c2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a8c6122c2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ad19190613a68565b60405180910390a35050565b6000600a60049054906101000a900460ff16905090565b6060611aff82612263565b611b0857600080fd5b6000600a600d846115b48110611b2157611b206142c8565b5b602091828204019190069054906101000a900460ff16611b419190614326565b60ff1690506002811115611b5457600290505b6101298160038110611b6957611b686142c8565b5b018054611b7590614297565b80601f0160208091040260200160405190810160405280929190818152602001828054611ba190614297565b8015611bee5780601f10611bc357610100808354040283529160200191611bee565b820191906000526020600020905b815481529060010190602001808311611bd157829003601f168201915b5050505050915050919050565b611c06848484610f01565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611c6857611c3184848484612d30565b611c67576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060611c7982612263565b611c8257600080fd5b6000611c8d83612533565b90506060611c9a84612217565b8015611cb25750600a60059054906101000a900460ff165b15611ce957600c611cc285612e80565b604051602001611cd392919061481a565b6040516020818303038152906040529050611d1c565b611cfa611cf5836128ad565b612ec7565b604051602001611d0a9190614873565b60405160208183030381529060405290505b611d2584612e80565b611d2e8361302a565b82604051602001611d41939291906149a3565b6040516020818303038152906040529050611d5b81612ec7565b604051602001611d6b9190614a32565b60405160208183030381529060405292505050919050565b6000600a60009054906101000a900461ffff16905090565b6000600a60059054906101000a900460ff16905090565b6060611dbd82612263565b611dc657600080fd5b611dd7611dd283612533565b61302a565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b82611e7b610eea565b611e8591906146bf565b611e8d611d83565b61ffff161015611e9c57600080fd5b600a60029054906101000a900461ffff1661ffff1683611ebb33612b1e565b611ec591906146bf565b1115611ed057600080fd5b82600954611ede91906146f3565b3414611ee957600080fd5b611f5d828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600b5433604051602001611f429190614aa0565b60405160208183030381529060405280519060200120613850565b611f6657600080fd5b611f703384612b75565b505050565b60003373ffffffffffffffffffffffffffffffffffffffff16611f9783611469565b73ffffffffffffffffffffffffffffffffffffffff1614611fb757600080fd5b611fc082612217565b1561201357600a600d836115b48110611fdc57611fdb6142c8565b5b602091828204019190068282829054906101000a900460ff160392506101000a81548160ff021916908360ff16021790555061205d565b600a600d836115b4811061202a576120296142c8565b5b602091828204019190068282829054906101000a900460ff160192506101000a81548160ff021916908360ff1602179055505b61206682612217565b9050919050565b6120756122ca565b73ffffffffffffffffffffffffffffffffffffffff166120936116dd565b73ffffffffffffffffffffffffffffffffffffffff16146120e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e0906143a3565b60405180910390fd5b806120f2610eea565b6120fc91906146bf565b612104611d83565b61ffff16101561211357600080fd5b61211d3382612b75565b50565b6121286122ca565b73ffffffffffffffffffffffffffffffffffffffff166121466116dd565b73ffffffffffffffffffffffffffffffffffffffff161461219c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612193906143a3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361220b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220290614b2d565b60405180910390fd5b6122148161246d565b50565b600061222282612263565b61222b57600080fd5b6009600d836115b48110612242576122416142c8565b5b602091828204019190069054906101000a900460ff1660ff16119050919050565b60008161226e6122d2565b1115801561227d575060005482105b80156122bb575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600033905090565b600090565b600080829050806122e66122d2565b1161236c5760005481101561236b5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612369575b6000810361235f576004600083600190039350838152602001908152602001600020549050612335565b809250505061239e565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861242b868684613867565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61253b613944565b612543613944565b60006008843060405160200161255a929190614bba565b6040516020818303038152906040528051906020012060001c61257d9190614bf1565b905080826000019060ff16908160ff1681525050600a84306040516020016125a6929190614c6e565b6040516020818303038152906040528051906020012060001c6125c99190614bf1565b9050600381106125d857600090505b80826020019060ff16908160ff1681525050600c84306040516020016125ff929190614cf1565b6040516020818303038152906040528051906020012060001c6126229190614bf1565b90506004811061263157600090505b80826040019060ff16908160ff1681525050600e8430604051602001612658929190614d74565b6040516020818303038152906040528051906020012060001c61267b9190614bf1565b905080826060019060ff16908160ff1681525050601484306040516020016126a4929190614df7565b6040516020818303038152906040528051906020012060001c6126c79190614bf1565b9050600581106126d657600090505b80826080019060ff16908160ff1681525050600c84306040516020016126fd929190614e7a565b6040516020818303038152906040528051906020012060001c6127209190614bf1565b9050808260a0019060ff16908160ff168152505060188430604051602001612749929190614efd565b6040516020818303038152906040528051906020012060001c61276c9190614bf1565b90506006811061277b57600090505b808260c0019060ff16908160ff1681525050606484306040516020016127a2929190614f80565b6040516020818303038152906040528051906020012060001c6127c59190614bf1565b9050600381106127d457600090505b808260e0019060ff16908160ff1681525050600a600d856115b481106127fd576127fc6142c8565b5b602091828204019190069054906101000a900460ff1661281d9190614326565b82610100019060ff16908160ff1681525050600282610100015160ff16111561285557600282610100019060ff16908160ff16815250505b6010843060405160200161286a929190615003565b6040516020818303038152906040528051906020012060001c61288d9190614bf1565b905060018110826101200190151590811515815250508192505050919050565b60606000604051806020016040528060008152509050600060405180602001604052806000815250905060008460e0015160ff161115612982576101268460e0015160ff1660038110612903576129026142c8565b5b016040516020016129149190615086565b60405160208183030381529060405291506101268460e0015160ff1660038110612941576129406142c8565b5b016101238560e0015160ff166003811061295e5761295d6142c8565b5b01604051602001612970929190615179565b60405160208183030381529060405290505b6000604051806020016040528060008152509050846101200151156129df576040518060600160405280602d8152602001615a98602d91399050816040516020016129cd91906152aa565b60405160208183030381529060405291505b60006040518061020001604052806101c38152602001615ac56101c391399050808360bb886000015160ff1660088110612a1c57612a1b6142c8565b5b018487604051602001612a339594939291906154ba565b60405160208183030381529060405290508060cb876020015160ff1660038110612a6057612a5f6142c8565b5b0160d1886040015160ff1660048110612a7c57612a7b6142c8565b5b0160d9896060015160ff16600e8110612a9857612a976142c8565b5b0160ff8a60a0015160ff16600c8110612ab457612ab36142c8565b5b0160f58b6080015160ff1660058110612ad057612acf6142c8565b5b016101178c60c0015160ff1660068110612aed57612aec6142c8565b5b01604051602001612b049796959493929190615643565b604051602081830303815290604052945050505050919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60008054905060008203612bb5576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612bc2600084838561240e565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612c3983612c2a6000866000612414565b612c3385613870565b1761243c565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612cda57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612c9f565b5060008203612d15576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050612d2b6000848385612467565b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d566122c2565b8786866040518563ffffffff1660e01b8152600401612d789493929190615708565b6020604051808303816000875af1925050508015612db457506040513d601f19601f82011682018060405250810190612db19190615769565b60015b612e2d573d8060008114612de4576040519150601f19603f3d011682016040523d82523d6000602084013e612de9565b606091505b506000815103612e25576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060806040510190508060405280825b600115612eb357600183039250600a81066030018353600a8104905080612e91575b508181036020830392508083525050919050565b60606000825103612ee957604051806020016040528060008152509050613025565b6000604051806060016040528060408152602001615a586040913990506000600360028551612f1891906146bf565b612f229190615796565b6004612f2e91906146f3565b67ffffffffffffffff811115612f4757612f46613f9a565b5b6040519080825280601f01601f191660200182016040528015612f795781602001600182028036833780820191505090505b509050600182016020820185865187015b80821015612fe5576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845360018401935050612f8a565b505060038651066001811461300157600281146130145761301c565b603d6001830353603d600283035361301c565b603d60018303535b50505080925050505b919050565b6060600082610120015161304d5760405180602001604052806000815250613084565b6040518060400160405280600381526020017fe29ca800000000000000000000000000000000000000000000000000000000008152505b905060c3836000015160ff16600881106130a1576130a06142c8565b5b01816040516020016130b49291906157c7565b60405160208183030381529060405290506131046040518060400160405280600881526020017f424720436f6c6f7200000000000000000000000000000000000000000000000081525082613880565b6131e76040518060400160405280600481526020017f456172730000000000000000000000000000000000000000000000000000000081525060ce866020015160ff1660038110613158576131576142c8565b5b01805461316490614297565b80601f016020809104026020016040519081016040528092919081815260200182805461319090614297565b80156131dd5780601f106131b2576101008083540402835291602001916131dd565b820191906000526020600020905b8154815290600101906020018083116131c057829003601f168201915b5050505050613880565b6132ca6040518060400160405280600381526020017f486174000000000000000000000000000000000000000000000000000000000081525060d5876040015160ff166004811061323b5761323a6142c8565b5b01805461324790614297565b80601f016020809104026020016040519081016040528092919081815260200182805461327390614297565b80156132c05780601f10613295576101008083540402835291602001916132c0565b820191906000526020600020905b8154815290600101906020018083116132a357829003601f168201915b5050505050613880565b6133ad6040518060400160405280600481526020017f457965730000000000000000000000000000000000000000000000000000000081525060e7886060015160ff16600e811061331e5761331d6142c8565b5b01805461332a90614297565b80601f016020809104026020016040519081016040528092919081815260200182805461335690614297565b80156133a35780601f10613378576101008083540402835291602001916133a3565b820191906000526020600020905b81548152906001019060200180831161338657829003601f168201915b5050505050613880565b6134916040518060400160405280600581526020017f4d6f75746800000000000000000000000000000000000000000000000000000081525061010b8960a0015160ff16600c8110613402576134016142c8565b5b01805461340e90614297565b80601f016020809104026020016040519081016040528092919081815260200182805461343a90614297565b80156134875780601f1061345c57610100808354040283529160200191613487565b820191906000526020600020905b81548152906001019060200180831161346a57829003601f168201915b5050505050613880565b6135746040518060400160405280600681526020017f436865656b73000000000000000000000000000000000000000000000000000081525060fa8a6080015160ff16600581106134e5576134e46142c8565b5b0180546134f190614297565b80601f016020809104026020016040519081016040528092919081815260200182805461351d90614297565b801561356a5780601f1061353f5761010080835404028352916020019161356a565b820191906000526020600020905b81548152906001019060200180831161354d57829003601f168201915b5050505050613880565b6136586040518060400160405280600981526020017f4163636573736f7279000000000000000000000000000000000000000000000081525061011d8b60c0015160ff16600681106135c9576135c86142c8565b5b0180546135d590614297565b80601f016020809104026020016040519081016040528092919081815260200182805461360190614297565b801561364e5780601f106136235761010080835404028352916020019161364e565b820191906000526020600020905b81548152906001019060200180831161363157829003601f168201915b5050505050613880565b61373c6040518060400160405280600681526020017f46696c74657200000000000000000000000000000000000000000000000000008152506101268c60e0015160ff16600381106136ad576136ac6142c8565b5b0180546136b990614297565b80601f01602080910402602001604051908101604052809291908181526020018280546136e590614297565b80156137325780601f1061370757610100808354040283529160200191613732565b820191906000526020600020905b81548152906001019060200180831161371557829003601f168201915b5050505050613880565b6138216040518060400160405280600781526020017f4c6963656e7365000000000000000000000000000000000000000000000000008152506101298d610100015160ff1660038110613792576137916142c8565b5b01805461379e90614297565b80601f01602080910402602001604051908101604052809291908181526020018280546137ca90614297565b80156138175780601f106137ec57610100808354040283529160200191613817565b820191906000526020600020905b8154815290600101906020018083116137fa57829003601f168201915b5050505050613880565b6040516020016138399998979695949392919061585d565b604051602081830303815290604052915050919050565b60008261385d85846138ac565b1490509392505050565b60009392505050565b60006001821460e11b9050919050565b606082826040516020016138959291906159be565b604051602081830303815290604052905092915050565b60008082905060005b84518110156138f7576138e2828683815181106138d5576138d46142c8565b5b6020026020010151613902565b915080806138ef90615a0f565b9150506138b5565b508091505092915050565b600081831061391a57613915828461392d565b613925565b613924838361392d565b5b905092915050565b600082600052816020526040600020905092915050565b604051806101400160405280600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff168152602001600060ff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6139fd816139c8565b8114613a0857600080fd5b50565b600081359050613a1a816139f4565b92915050565b600060208284031215613a3657613a356139be565b5b6000613a4484828501613a0b565b91505092915050565b60008115159050919050565b613a6281613a4d565b82525050565b6000602082019050613a7d6000830184613a59565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613abd578082015181840152602081019050613aa2565b60008484015250505050565b6000601f19601f8301169050919050565b6000613ae582613a83565b613aef8185613a8e565b9350613aff818560208601613a9f565b613b0881613ac9565b840191505092915050565b60006020820190508181036000830152613b2d8184613ada565b905092915050565b6000819050919050565b613b4881613b35565b8114613b5357600080fd5b50565b600081359050613b6581613b3f565b92915050565b600060208284031215613b8157613b806139be565b5b6000613b8f84828501613b56565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613bc382613b98565b9050919050565b613bd381613bb8565b82525050565b6000602082019050613bee6000830184613bca565b92915050565b613bfd81613bb8565b8114613c0857600080fd5b50565b600081359050613c1a81613bf4565b92915050565b60008060408385031215613c3757613c366139be565b5b6000613c4585828601613c0b565b9250506020613c5685828601613b56565b9150509250929050565b600060ff82169050919050565b613c7681613c60565b8114613c8157600080fd5b50565b600081359050613c9381613c6d565b92915050565b60008060408385031215613cb057613caf6139be565b5b6000613cbe85828601613b56565b9250506020613ccf85828601613c84565b9150509250929050565b613ce281613b35565b82525050565b6000602082019050613cfd6000830184613cd9565b92915050565b600080600060608486031215613d1c57613d1b6139be565b5b6000613d2a86828701613c0b565b9350506020613d3b86828701613c0b565b9250506040613d4c86828701613b56565b9150509250925092565b6000819050919050565b613d6981613d56565b82525050565b6000602082019050613d846000830184613d60565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613daf57613dae613d8a565b5b8235905067ffffffffffffffff811115613dcc57613dcb613d8f565b5b602083019150836001820283011115613de857613de7613d94565b5b9250929050565b60008060208385031215613e0657613e056139be565b5b600083013567ffffffffffffffff811115613e2457613e236139c3565b5b613e3085828601613d99565b92509250509250929050565b600060208284031215613e5257613e516139be565b5b6000613e6084828501613c0b565b91505092915050565b600061ffff82169050919050565b613e8081613e69565b8114613e8b57600080fd5b50565b600081359050613e9d81613e77565b92915050565b600060208284031215613eb957613eb86139be565b5b6000613ec784828501613e8e565b91505092915050565b613ed981613d56565b8114613ee457600080fd5b50565b600081359050613ef681613ed0565b92915050565b600060208284031215613f1257613f116139be565b5b6000613f2084828501613ee7565b91505092915050565b613f3281613a4d565b8114613f3d57600080fd5b50565b600081359050613f4f81613f29565b92915050565b60008060408385031215613f6c57613f6b6139be565b5b6000613f7a85828601613c0b565b9250506020613f8b85828601613f40565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613fd282613ac9565b810181811067ffffffffffffffff82111715613ff157613ff0613f9a565b5b80604052505050565b60006140046139b4565b90506140108282613fc9565b919050565b600067ffffffffffffffff8211156140305761402f613f9a565b5b61403982613ac9565b9050602081019050919050565b82818337600083830152505050565b600061406861406384614015565b613ffa565b90508281526020810184848401111561408457614083613f95565b5b61408f848285614046565b509392505050565b600082601f8301126140ac576140ab613d8a565b5b81356140bc848260208601614055565b91505092915050565b600080600080608085870312156140df576140de6139be565b5b60006140ed87828801613c0b565b94505060206140fe87828801613c0b565b935050604061410f87828801613b56565b925050606085013567ffffffffffffffff8111156141305761412f6139c3565b5b61413c87828801614097565b91505092959194509250565b61415181613e69565b82525050565b600060208201905061416c6000830184614148565b92915050565b60008060408385031215614189576141886139be565b5b600061419785828601613c0b565b92505060206141a885828601613c0b565b9150509250929050565b60008083601f8401126141c8576141c7613d8a565b5b8235905067ffffffffffffffff8111156141e5576141e4613d8f565b5b60208301915083602082028301111561420157614200613d94565b5b9250929050565b600080600060408486031215614221576142206139be565b5b600061422f86828701613b56565b935050602084013567ffffffffffffffff8111156142505761424f6139c3565b5b61425c868287016141b2565b92509250509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806142af57607f821691505b6020821081036142c2576142c1614268565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061433182613c60565b915061433c83613c60565b92508261434c5761434b6142f7565b5b828206905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061438d602083613a8e565b915061439882614357565b602082019050919050565b600060208201905081810360008301526143bc81614380565b9050919050565b600081905092915050565b50565b60006143de6000836143c3565b91506143e9826143ce565b600082019050919050565b60006143ff826143d1565b9150819050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026144767fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614439565b6144808683614439565b95508019841693508086168417925050509392505050565b6000819050919050565b60006144bd6144b86144b384613b35565b614498565b613b35565b9050919050565b6000819050919050565b6144d7836144a2565b6144eb6144e3826144c4565b848454614446565b825550505050565b600090565b6145006144f3565b61450b8184846144ce565b505050565b5b8181101561452f576145246000826144f8565b600181019050614511565b5050565b601f8211156145745761454581614414565b61454e84614429565b8101602085101561455d578190505b61457161456985614429565b830182614510565b50505b505050565b600082821c905092915050565b600061459760001984600802614579565b1980831691505092915050565b60006145b08383614586565b9150826002028217905092915050565b6145ca8383614409565b67ffffffffffffffff8111156145e3576145e2613f9a565b5b6145ed8254614297565b6145f8828285614533565b6000601f8311600181146146275760008415614615578287013590505b61461f85826145a4565b865550614687565b601f19841661463586614414565b60005b8281101561465d57848901358255600182019150602085019450602081019050614638565b8683101561467a5784890135614676601f891682614586565b8355505b6001600288020188555050505b50505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006146ca82613b35565b91506146d583613b35565b92508282019050808211156146ed576146ec614690565b5b92915050565b60006146fe82613b35565b915061470983613b35565b925082820261471781613b35565b9150828204841483151761472e5761472d614690565b5b5092915050565b600081905092915050565b6000815461474d81614297565b6147578186614735565b945060018216600081146147725760018114614787576147ba565b60ff19831686528115158202860193506147ba565b61479085614414565b60005b838110156147b257815481890152600182019150602081019050614793565b838801955050505b50505092915050565b60006147ce82613a83565b6147d88185614735565b93506147e8818560208601613a9f565b80840191505092915050565b7f2e706e6700000000000000000000000000000000000000000000000000000000815250565b60006148268285614740565b915061483282846147c3565b915061483d826147f4565b6004820191508190509392505050565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000815250565b600061487e8261484d565b601a8201915061488e82846147c3565b915081905092915050565b7f7b226e616d65223a22436875626c696e20230000000000000000000000000000815250565b7f222c20226465736372697074696f6e223a224120436875626c696e20626f726e60008201527f206f662074686520626c6f636b636861696e2e222c226174747269627574657360208201527f223a000000000000000000000000000000000000000000000000000000000000604082015250565b6000614941604283614735565b915061494c826148bf565b604282019050919050565b7f2c2022696d616765223a22000000000000000000000000000000000000000000815250565b7f227d000000000000000000000000000000000000000000000000000000000000815250565b60006149ae82614899565b6012820191506149be82866147c3565b91506149c982614934565b91506149d582856147c3565b91506149e082614957565b600b820191506149f082846147c3565b91506149fb8261497d565b600282019150819050949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815250565b6000614a3d82614a0c565b601d82019150614a4d82846147c3565b915081905092915050565b60008160601b9050919050565b6000614a7082614a58565b9050919050565b6000614a8282614a65565b9050919050565b614a9a614a9582613bb8565b614a77565b82525050565b6000614aac8284614a89565b60148201915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614b17602683613a8e565b9150614b2282614abb565b604082019050919050565b60006020820190508181036000830152614b4681614b0a565b9050919050565b6000819050919050565b614b68614b6382613b35565b614b4d565b82525050565b7f3100000000000000000000000000000000000000000000000000000000000000600082015250565b6000614ba4600183614735565b9150614baf82614b6e565b600182019050919050565b6000614bc68285614b57565b602082019150614bd68284614a89565b601482019150614be582614b97565b91508190509392505050565b6000614bfc82613b35565b9150614c0783613b35565b925082614c1757614c166142f7565b5b828206905092915050565b7f3200000000000000000000000000000000000000000000000000000000000000600082015250565b6000614c58600183614735565b9150614c6382614c22565b600182019050919050565b6000614c7a8285614b57565b602082019150614c8a8284614a89565b601482019150614c9982614c4b565b91508190509392505050565b7f3300000000000000000000000000000000000000000000000000000000000000600082015250565b6000614cdb600183614735565b9150614ce682614ca5565b600182019050919050565b6000614cfd8285614b57565b602082019150614d0d8284614a89565b601482019150614d1c82614cce565b91508190509392505050565b7f3400000000000000000000000000000000000000000000000000000000000000600082015250565b6000614d5e600183614735565b9150614d6982614d28565b600182019050919050565b6000614d808285614b57565b602082019150614d908284614a89565b601482019150614d9f82614d51565b91508190509392505050565b7f3500000000000000000000000000000000000000000000000000000000000000600082015250565b6000614de1600183614735565b9150614dec82614dab565b600182019050919050565b6000614e038285614b57565b602082019150614e138284614a89565b601482019150614e2282614dd4565b91508190509392505050565b7f3600000000000000000000000000000000000000000000000000000000000000600082015250565b6000614e64600183614735565b9150614e6f82614e2e565b600182019050919050565b6000614e868285614b57565b602082019150614e968284614a89565b601482019150614ea582614e57565b91508190509392505050565b7f3700000000000000000000000000000000000000000000000000000000000000600082015250565b6000614ee7600183614735565b9150614ef282614eb1565b600182019050919050565b6000614f098285614b57565b602082019150614f198284614a89565b601482019150614f2882614eda565b91508190509392505050565b7f3800000000000000000000000000000000000000000000000000000000000000600082015250565b6000614f6a600183614735565b9150614f7582614f34565b600182019050919050565b6000614f8c8285614b57565b602082019150614f9c8284614a89565b601482019150614fab82614f5d565b91508190509392505050565b7f3900000000000000000000000000000000000000000000000000000000000000600082015250565b6000614fed600183614735565b9150614ff882614fb7565b600182019050919050565b600061500f8285614b57565b60208201915061501f8284614a89565b60148201915061502e82614fe0565b91508190509392505050565b7f2066696c7465723d2775726c2823000000000000000000000000000000000000815250565b7f2927000000000000000000000000000000000000000000000000000000000000815250565b60006150918261503a565b600e820191506150a18284614740565b91506150ac82615060565b60028201915081905092915050565b7f3c66696c7465722069643d220000000000000000000000000000000000000000815250565b7f2220783d222d3530252220793d222d353025222077696474683d22323030252260008201527f206865696768743d2232303025223e0000000000000000000000000000000000602082015250565b600061513d602f83614735565b9150615148826150e1565b602f82019050919050565b7f3c2f66696c7465723e0000000000000000000000000000000000000000000000815250565b6000615184826150bb565b600c820191506151948285614740565b915061519f82615130565b91506151ab8284614740565b91506151b682615153565b6009820191508190509392505050565b7f3c66696c74657220783d22302220793d2230222077696474683d22313030252260008201527f206865696768743d2231303025222069643d22666267223e3c6665547572627560208201527f6c656e636520626173654672657175656e63793d22302e3030323420302e303060408201527f333622206e756d4f6374617665733d2231362220736565643d223138222f3e3c60608201527f2f66696c7465723e000000000000000000000000000000000000000000000000608082015250565b6000615294608883614735565b915061529f826151c6565b608882019050919050565b60006152b682846147c3565b91506152c182615287565b915081905092915050565b7f3c2f646566733e3c7061746820643d274d30203048363030563630304830272060008201527f66696c6c3d272300000000000000000000000000000000000000000000000000602082015250565b6000615328602783614735565b9150615333826152cc565b602782019050919050565b7f272f3e0000000000000000000000000000000000000000000000000000000000815250565b7f3c672069643d27636875622720637572736f723d27706f696e74657227000000815250565b7f3e3c672066696c6c3d2723666666273e3c656c6c697073652063783d2733303060008201527f272063793d27343630272072783d27313630272072793d273530272f3e3c706160208201527f746820643d274d313430203134306833323076333230483134307a272f3e3c2f60408201527f673e3c656c6c697073652063783d27333030272063793d27313430272072783d60608201527f27313630272072793d273530272066696c6c3d2723463846344634272f3e3c6760808201527f2069643d276661636527207472616e73666f726d3d27726f74617465282d352060a08201527f333432322e333335202d323831392e343929273e00000000000000000000000060c082015250565b60006154a460d483614735565b91506154af8261538a565b60d482019050919050565b60006154c682886147c3565b91506154d282876147c3565b91506154dd8261531b565b91506154e98286614740565b91506154f48261533e565b60038201915061550482856147c3565b915061550f82615364565b601d8201915061551f82846147c3565b915061552a82615497565b91508190509695505050505050565b7f3c2f673e3c616e696d6174654d6f74696f6e20706174683d274d302c30202d3360008201527f2c2d3920302c2d313820362c2d3920322c3020302c347a27206b6579506f696e60208201527f74733d27303b302e313837353b302e3337353b302e353632353b302e37353b3060408201527f2e393b3127206b657954696d65733d27303b302e31383b302e33373b302e353860608201527f3b302e37323b302e38373b3127206475723d27302e36732720626567696e3d2760808201527f636c69636b272f3e3c2f673e3c2f7376673e000000000000000000000000000060a082015250565b600061562d60b283614735565b915061563882615539565b60b282019050919050565b600061564f828a6147c3565b915061565b8289614740565b91506156678288614740565b91506156738287614740565b915061567f8286614740565b915061568b8285614740565b91506156978284614740565b91506156a282615620565b915081905098975050505050505050565b600081519050919050565b600082825260208201905092915050565b60006156da826156b3565b6156e481856156be565b93506156f4818560208601613a9f565b6156fd81613ac9565b840191505092915050565b600060808201905061571d6000830187613bca565b61572a6020830186613bca565b6157376040830185613cd9565b818103606083015261574981846156cf565b905095945050505050565b600081519050615763816139f4565b92915050565b60006020828403121561577f5761577e6139be565b5b600061578d84828501615754565b91505092915050565b60006157a182613b35565b91506157ac83613b35565b9250826157bc576157bb6142f7565b5b828204905092915050565b60006157d38285614740565b91506157df82846147c3565b91508190509392505050565b7f5b00000000000000000000000000000000000000000000000000000000000000815250565b7f2c00000000000000000000000000000000000000000000000000000000000000815250565b7f5d00000000000000000000000000000000000000000000000000000000000000815250565b6000615868826157eb565b600182019150615878828c6147c3565b915061588382615811565b600182019150615893828b6147c3565b915061589e82615811565b6001820191506158ae828a6147c3565b91506158b982615811565b6001820191506158c982896147c3565b91506158d482615811565b6001820191506158e482886147c3565b91506158ef82615811565b6001820191506158ff82876147c3565b915061590a82615811565b60018201915061591a82866147c3565b915061592582615811565b60018201915061593582856147c3565b915061594082615811565b60018201915061595082846147c3565b915061595b82615837565b6001820191508190509a9950505050505050505050565b7f7b2274726169745f74797065223a220000000000000000000000000000000000815250565b7f222c2276616c7565223a22000000000000000000000000000000000000000000815250565b60006159c982615972565b600f820191506159d982856147c3565b91506159e482615998565b600b820191506159f482846147c3565b91506159ff8261497d565b6002820191508190509392505050565b6000615a1a82613b35565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615a4c57615a4b614690565b5b60018201905091905056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c7061746820643d224d30203048363030563630304830222066696c7465723d2275726c282366626729222f3e3c7376672077696474683d2736303027206865696768743d27363030272076696577426f783d2730203020363030203630302720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f323030302f7376672720786d6c6e733a786c696e6b3d27687474703a2f2f7777772e77332e6f72672f313939392f786c696e6b273e3c7374796c653e2e6c6e66742c2e6c6e72747b7374726f6b653a233030303b7374726f6b652d6c696e656361703a726f756e647d2e6c6e66747b66696c6c3a677261793b7374726f6b652d77696474683a383b7d2e6c6e72747b66696c6c3a6e6f6e653b7374726f6b652d77696474683a373b7374726f6b652d6c696e656a6f696e3a62657a656c7d2e74687b7374726f6b652d77696474683a31327d2e746e7b7374726f6b652d77696474683a347d2e776c72747b7374726f6b653a236666663b7374726f6b652d77696474683a337d746578747b666f6e742d66616d696c793a27436f6d69632053616e73204d53272c27436f6d69632053616e73272c274368616c6b626f617264205345272c27436f6d6963204e657565272c637572736976653b666f6e742d73697a653a313270747d3c2f7374796c653e3c646566733ea264697066735822122012f333c9a99c28a9700cc3bc139a4067b8da2210a8b05160ecf4c9741878ac4b64736f6c63430008110033
Deployed Bytecode Sourcemap
67329:20089:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18740:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19642:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26125:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25566:400;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;86605:767;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;86078:101;;;;;;;;;;;;;:::i;:::-;;15393:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29832:2817;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;85810:158;;;;;;;;;;;;;:::i;:::-;;67633:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32745:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67949:87;;;;;;;;;;;;;:::i;:::-;;85696:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21035:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16577:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62462:103;;;;;;;;;;;;;:::i;:::-;;68150:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67833:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61811:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19818:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85532:156;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84298:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68688:345;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26683:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68044:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78575:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33528:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;84651:779;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85438:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;85976:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;84471:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27148:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68253:427;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;86187:410;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69130:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62720:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78871:133;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18740:639;18825:4;19164:10;19149:25;;:11;:25;;;;:102;;;;19241:10;19226:25;;:11;:25;;;;19149:102;:179;;;;19318:10;19303:25;;:11;:25;;;;19149:179;19129:199;;18740:639;;;:::o;19642:100::-;19696:13;19729:5;19722:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19642:100;:::o;26125:218::-;26201:7;26226:16;26234:7;26226;:16::i;:::-;26221:64;;26251:34;;;;;;;;;;;;;;26221:64;26305:15;:24;26321:7;26305:24;;;;;;;;;;;:30;;;;;;;;;;;;26298:37;;26125:218;;;:::o;25566:400::-;25647:13;25663:16;25671:7;25663;:16::i;:::-;25647:32;;25719:5;25696:28;;:19;:17;:19::i;:::-;:28;;;25692:175;;25744:44;25761:5;25768:19;:17;:19::i;:::-;25744:16;:44::i;:::-;25739:128;;25816:35;;;;;;;;;;;;;;25739:128;25692:175;25912:2;25879:15;:24;25895:7;25879:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;25950:7;25946:2;25930:28;;25939:5;25930:28;;;;;;;;;;;;25636:330;25566:400;;:::o;86605:767::-;86675:13;86728:10;86708:30;;:16;86716:7;86708;:16::i;:::-;:30;;;86700:39;;;;;;86767:1;86758:5;:10;;;:24;;;;86781:1;86772:5;:10;;;86758:24;86750:33;;;;;;86794:20;86839:2;86817:10;86828:7;86817:19;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:24;;;;:::i;:::-;86794:47;;86888:1;86870:14;:19;;;86867:478;;87022:5;86999:10;87010:7;86999:19;;;;;;;:::i;:::-;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87064:9;87074:5;87064:16;;;;;;;;;:::i;:::-;;;87057:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86867:478;87129:1;87111:14;:19;;;:33;;;;;87143:1;87134:5;:10;;;87111:33;87108:237;;;87278:1;87255:10;87266:7;87255:19;;;;;;;:::i;:::-;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87316:9;87326:5;87316:16;;;;;;;;;:::i;:::-;;;87309:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87108:237;87355:8;;;86605:767;;;;;:::o;86078:101::-;62042:12;:10;:12::i;:::-;62031:23;;:7;:5;:7::i;:::-;:23;;;62023:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;86157:14:::1;;;;;;;;;;;86156:15;86139:14;;:32;;;;;;;;;;;;;;;;;;86078:101::o:0;15393:323::-;15454:7;15682:15;:13;:15::i;:::-;15667:12;;15651:13;;:28;:46;15644:53;;15393:323;:::o;29832:2817::-;29966:27;29996;30015:7;29996:18;:27::i;:::-;29966:57;;30081:4;30040:45;;30056:19;30040:45;;;30036:86;;30094:28;;;;;;;;;;;;;;30036:86;30136:27;30165:23;30192:35;30219:7;30192:26;:35::i;:::-;30135:92;;;;30327:68;30352:15;30369:4;30375:19;:17;:19::i;:::-;30327:24;:68::i;:::-;30322:180;;30415:43;30432:4;30438:19;:17;:19::i;:::-;30415:16;:43::i;:::-;30410:92;;30467:35;;;;;;;;;;;;;;30410:92;30322:180;30533:1;30519:16;;:2;:16;;;30515:52;;30544:23;;;;;;;;;;;;;;30515:52;30580:43;30602:4;30608:2;30612:7;30621:1;30580:21;:43::i;:::-;30716:15;30713:160;;;30856:1;30835:19;30828:30;30713:160;31253:18;:24;31272:4;31253:24;;;;;;;;;;;;;;;;31251:26;;;;;;;;;;;;31322:18;:22;31341:2;31322:22;;;;;;;;;;;;;;;;31320:24;;;;;;;;;;;31644:146;31681:2;31730:45;31745:4;31751:2;31755:19;31730:14;:45::i;:::-;11792:8;31702:73;31644:18;:146::i;:::-;31615:17;:26;31633:7;31615:26;;;;;;;;;;;:175;;;;31961:1;11792:8;31910:19;:47;:52;31906:627;;31983:19;32015:1;32005:7;:11;31983:33;;32172:1;32138:17;:30;32156:11;32138:30;;;;;;;;;;;;:35;32134:384;;32276:13;;32261:11;:28;32257:242;;32456:19;32423:17;:30;32441:11;32423:30;;;;;;;;;;;:52;;;;32257:242;32134:384;31964:569;31906:627;32580:7;32576:2;32561:27;;32570:4;32561:27;;;;;;;;;;;;32599:42;32620:4;32626:2;32630:7;32639:1;32599:20;:42::i;:::-;29955:2694;;;29832:2817;;;:::o;85810:158::-;62042:12;:10;:12::i;:::-;62031:23;;:7;:5;:7::i;:::-;:23;;;62023:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;85866:12:::1;85884:10;:15;;85907:21;85884:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85865:68;;;85952:7;85944:16;;;::::0;::::1;;85854:114;85810:158::o:0;67633:25::-;;;;:::o;32745:185::-;32883:39;32900:4;32906:2;32910:7;32883:39;;;;;;;;;;;;:16;:39::i;:::-;32745:185;;;:::o;67949:87::-;62042:12;:10;:12::i;:::-;62031:23;;:7;:5;:7::i;:::-;:23;;;62023:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68023:4:::1;68005:15;;:22;;;;;;;;;;;;;;;;;;67949:87::o:0;85696:106::-;62042:12;:10;:12::i;:::-;62031:23;;:7;:5;:7::i;:::-;:23;;;62023:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;85787:7:::1;;85771:13;:23;;;;;;;:::i;:::-;;85696:106:::0;;:::o;21035:152::-;21107:7;21150:27;21169:7;21150:18;:27::i;:::-;21127:52;;21035:152;;;:::o;16577:233::-;16649:7;16690:1;16673:19;;:5;:19;;;16669:60;;16701:28;;;;;;;;;;;;;;16669:60;10736:13;16747:18;:25;16766:5;16747:25;;;;;;;;;;;;;;;;:55;16740:62;;16577:233;;;:::o;62462:103::-;62042:12;:10;:12::i;:::-;62031:23;;:7;:5;:7::i;:::-;:23;;;62023:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62527:30:::1;62554:1;62527:18;:30::i;:::-;62462:103::o:0;68150:95::-;62042:12;:10;:12::i;:::-;62031:23;;:7;:5;:7::i;:::-;:23;;;62023:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68233:3:::1;68222:8;;:14;;;;;;;;;;;;;;;;;;68150:95:::0;:::o;67833:108::-;62042:12;:10;:12::i;:::-;62031:23;;:7;:5;:7::i;:::-;:23;;;62023:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;67921:11:::1;67908:10;:24;;;;67833:108:::0;:::o;61811:87::-;61857:7;61884:6;;;;;;;;;;;61877:13;;61811:87;:::o;19818:104::-;19874:13;19907:7;19900:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19818:104;:::o;85532:156::-;62042:12;:10;:12::i;:::-;62031:23;;:7;:5;:7::i;:::-;:23;;;62023:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;85622:5:::1;85606:21;;:13;:11;:13::i;:::-;:21;:44;;;;;85639:11;:9;:11::i;:::-;85631:19;;:5;:19;;;85606:44;85598:53;;;::::0;::::1;;85675:5;85662:10;;:18;;;;;;;;;;;;;;;;;;85532:156:::0;:::o;84298:165::-;84356:13;84390:16;84398:7;84390;:16::i;:::-;84382:25;;;;;;84428:26;84436:17;84445:7;84436:8;:17::i;:::-;84428:7;:26::i;:::-;84421:33;;84298:165;;;:::o;68688:345::-;68756:15;;;;;;;;;;;:60;;;;;68807:8;68791:13;:11;:13::i;:::-;:24;;;;:::i;:::-;68775:11;:9;:11::i;:::-;:41;;;;68756:60;68748:69;;;;;;68877:8;;;;;;;;;;;68837:48;;68865:8;68837:25;68851:10;68837:13;:25::i;:::-;:36;;;;:::i;:::-;:48;;68829:57;;;;;;68933:8;68920:10;;:21;;;;:::i;:::-;68906:9;:36;68898:45;;;;;;68976:9;68962:23;;:10;:23;;;68954:32;;;;;;68998:27;69004:10;69016:8;68998:5;:27::i;:::-;68688:345;:::o;26683:308::-;26794:19;:17;:19::i;:::-;26782:31;;:8;:31;;;26778:61;;26822:17;;;;;;;;;;;;;;26778:61;26904:8;26852:18;:39;26871:19;:17;:19::i;:::-;26852:39;;;;;;;;;;;;;;;:49;26892:8;26852:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;26964:8;26928:55;;26943:19;:17;:19::i;:::-;26928:55;;;26974:8;26928:55;;;;;;:::i;:::-;;;;;;;;26683:308;;:::o;68044:98::-;68095:4;68119:15;;;;;;;;;;;68112:22;;68044:98;:::o;78575:288::-;78628:13;78663:11;78671:2;78663:7;:11::i;:::-;78655:20;;;;;;78687:17;78724:2;78707:10;78718:2;78707:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:19;;;;:::i;:::-;78687:39;;;;78765:1;78753:9;:13;78750:67;;;78782:1;78770:13;;78750:67;78834:9;78844;78834:20;;;;;;;:::i;:::-;;;78827:27;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78575:288;;;:::o;33528:399::-;33695:31;33708:4;33714:2;33718:7;33695:12;:31::i;:::-;33759:1;33741:2;:14;;;:19;33737:183;;33780:56;33811:4;33817:2;33821:7;33830:5;33780:30;:56::i;:::-;33775:145;;33864:40;;;;;;;;;;;;;;33775:145;33737:183;33528:399;;;;:::o;84651:779::-;84716:13;84750:16;84758:7;84750;:16::i;:::-;84742:25;;;;;;84789:20;84812:17;84821:7;84812:8;:17::i;:::-;84789:40;;84842:20;84877:15;84884:7;84877:6;:15::i;:::-;:33;;;;;84896:14;;;;;;;;;;;84877:33;84874:264;;;84950:13;84965:18;84975:7;84965:9;:18::i;:::-;84936:56;;;;;;;;;:::i;:::-;;;;;;;;;;;;;84927:65;;84874:264;;;85089:35;85109:13;85117:4;85109:7;:13::i;:::-;85089;:35::i;:::-;85045:80;;;;;;;;:::i;:::-;;;;;;;;;;;;;85036:89;;84874:264;85194:18;85204:7;85194:9;:18::i;:::-;85282:16;85293:4;85282:10;:16::i;:::-;85314:6;85159:168;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;85150:177;;85392:28;85412:6;85392:13;:28::i;:::-;85346:75;;;;;;;;:::i;:::-;;;;;;;;;;;;;85339:82;;;;84651:779;;;:::o;85438:86::-;85480:6;85506:10;;;;;;;;;;;85499:17;;85438:86;:::o;85976:94::-;86024:4;86048:14;;;;;;;;;;;86041:21;;85976:94;:::o;84471:172::-;84532:13;84567:16;84575:7;84567;:16::i;:::-;84559:25;;;;;;84605:29;84616:17;84625:7;84616:8;:17::i;:::-;84605:10;:29::i;:::-;84598:36;;84471:172;;;:::o;27148:164::-;27245:4;27269:18;:25;27288:5;27269:25;;;;;;;;;;;;;;;:35;27295:8;27269:35;;;;;;;;;;;;;;;;;;;;;;;;;27262:42;;27148:164;;;;:::o;68253:427::-;68394:8;68378:13;:11;:13::i;:::-;:24;;;;:::i;:::-;68362:11;:9;:11::i;:::-;:41;;;;68354:50;;;;;;68464:8;;;;;;;;;;;68424:48;;68452:8;68424:25;68438:10;68424:13;:25::i;:::-;:36;;;;:::i;:::-;:48;;68416:57;;;;;;68519:8;68506:10;;:21;;;;:::i;:::-;68492:9;:36;68484:45;;;;;;68548:84;68567:11;;68548:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68580:10;;68619;68602:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;68592:39;;;;;;68548:18;:84::i;:::-;68540:93;;;;;;68645:27;68651:10;68663:8;68645:5;:27::i;:::-;68253:427;;;:::o;86187:410::-;86247:4;86291:10;86271:30;;:16;86279:7;86271;:16::i;:::-;:30;;;86263:39;;;;;;86326:15;86333:7;86326:6;:15::i;:::-;86323:231;;;86411:2;86388:10;86399:7;86388:19;;;;;;;:::i;:::-;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86323:231;;;86524:2;86501:10;86512:7;86501:19;;;;;;;:::i;:::-;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86323:231;86573:15;86580:7;86573:6;:15::i;:::-;86566:22;;86187:410;;;:::o;69130:164::-;62042:12;:10;:12::i;:::-;62031:23;;:7;:5;:7::i;:::-;:23;;;62023:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69237:8:::1;69221:13;:11;:13::i;:::-;:24;;;;:::i;:::-;69205:11;:9;:11::i;:::-;:41;;;;69197:50;;;::::0;::::1;;69259:27;69265:10;69277:8;69259:5;:27::i;:::-;69130:164:::0;:::o;62720:201::-;62042:12;:10;:12::i;:::-;62031:23;;:7;:5;:7::i;:::-;:23;;;62023:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;62829:1:::1;62809:22;;:8;:22;;::::0;62801:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;62885:28;62904:8;62885:18;:28::i;:::-;62720:201:::0;:::o;78871:133::-;78920:4;78946:11;78954:2;78946:7;:11::i;:::-;78938:20;;;;;;78994:1;78977:10;78988:2;78977:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:18;;;78970:25;;78871:133;;;:::o;27570:282::-;27635:4;27691:7;27672:15;:13;:15::i;:::-;:26;;:66;;;;;27725:13;;27715:7;:23;27672:66;:153;;;;;27824:1;11512:8;27776:17;:26;27794:7;27776:26;;;;;;;;;;;;:44;:49;27672:153;27652:173;;27570:282;;;:::o;49336:105::-;49396:7;49423:10;49416:17;;49336:105;:::o;60535:98::-;60588:7;60615:10;60608:17;;60535:98;:::o;14909:92::-;14965:7;14909:92;:::o;22190:1275::-;22257:7;22277:12;22292:7;22277:22;;22360:4;22341:15;:13;:15::i;:::-;:23;22337:1061;;22394:13;;22387:4;:20;22383:1015;;;22432:14;22449:17;:23;22467:4;22449:23;;;;;;;;;;;;22432:40;;22566:1;11512:8;22538:6;:24;:29;22534:845;;23203:113;23220:1;23210:6;:11;23203:113;;23263:17;:25;23281:6;;;;;;;23263:25;;;;;;;;;;;;23254:34;;23203:113;;;23349:6;23342:13;;;;;;22534:845;22409:989;22383:1015;22337:1061;23426:31;;;;;;;;;;;;;;22190:1275;;;;:::o;28733:479::-;28835:27;28864:23;28905:38;28946:15;:24;28962:7;28946:24;;;;;;;;;;;28905:65;;29117:18;29094:41;;29174:19;29168:26;29149:45;;29079:126;28733:479;;;:::o;27961:659::-;28110:11;28275:16;28268:5;28264:28;28255:37;;28435:16;28424:9;28420:32;28407:45;;28585:15;28574:9;28571:30;28563:5;28552:9;28549:20;28546:56;28536:66;;27961:659;;;;;:::o;34589:159::-;;;;;:::o;48645:311::-;48780:7;48800:16;11916:3;48826:19;:41;;48800:68;;11916:3;48894:31;48905:4;48911:2;48915:9;48894:10;:31::i;:::-;48886:40;;:62;;48879:69;;;48645:311;;;;;:::o;24013:450::-;24093:14;24261:16;24254:5;24250:28;24241:37;;24438:5;24424:11;24399:23;24395:41;24392:52;24385:5;24382:63;24372:73;;24013:450;;;;:::o;35413:158::-;;;;;:::o;63081:191::-;63155:16;63174:6;;;;;;;;;;;63155:25;;63200:8;63191:6;;:17;;;;;;;;;;;;;;;;;;63255:8;63224:40;;63245:8;63224:40;;;;;;;;;;;;63144:128;63081:191;:::o;79327:1977::-;79380:15;;:::i;:::-;79408:20;;:::i;:::-;79477:12;79555:16;79527:2;79539:4;79510:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;79500:51;;;;;;79492:60;;:79;;;;:::i;:::-;79477:94;;79608:4;79582;:17;;:31;;;;;;;;;;;79721:2;79693;79705:4;79676:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;79666:51;;;;;;79658:60;;:65;;;;:::i;:::-;79651:72;;79745:12;79737:4;:20;79734:38;;79768:1;79761:8;;79734:38;79806:4;79783;:14;;:28;;;;;;;;;;;79919:2;79891;79903:4;79874:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;79864:51;;;;;;79856:60;;:65;;;;:::i;:::-;79849:72;;79943:12;79935:4;:20;79932:38;;79966:1;79959:8;;79932:38;80002:4;79980;:13;;:27;;;;;;;;;;;80116:12;80088:2;80100:4;80071:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;80061:51;;;;;;80053:60;;:75;;;;:::i;:::-;80046:82;;80162:4;80139;:14;;:28;;;;;;;;;;;80278:2;80250;80262:4;80233:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;80223:51;;;;;;80215:60;;:65;;;;:::i;:::-;80208:72;;80302:14;80294:4;:22;80291:40;;80327:1;80320:8;;80291:40;80366:4;80341;:16;;:30;;;;;;;;;;;80481:14;80453:2;80465:4;80436:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;80426:51;;;;;;80418:60;;:77;;;;:::i;:::-;80411:84;;80530:4;80506;:15;;:29;;;;;;;;;;;80651:2;80623;80635:4;80606:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;80596:51;;;;;;80588:60;;:65;;;;:::i;:::-;80581:72;;80676:19;80668:4;:27;80665:45;;80706:1;80699:8;;80665:45;80748:4;80720;:19;;:33;;;;;;;;;;;80865:3;80837:2;80849:4;80820:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;80810:51;;;;;;80802:60;;:66;;;;:::i;:::-;80795:73;;80890:15;80882:4;:23;80879:41;;80916:1;80909:8;;80879:41;80955:4;80930;:16;;:30;;;;;;;;;;;81011:2;80994:10;81005:2;80994:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:19;;;;:::i;:::-;80974:4;:17;;:39;;;;;;;;;;;81060:1;81040:4;:17;;;:21;;;81037:83;;;81085:1;81065:4;:17;;:21;;;;;;;;;;;81037:83;81230:2;81202;81214:4;81185:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;81175:51;;;;;;81167:60;;:65;;;;:::i;:::-;81160:72;;81267:1;81260:4;:8;81243:4;:12;;:27;;;;;;;;;;;81291:4;81284:11;;;;79327:1977;;;:::o;81312:2074::-;81374:13;81400:23;:28;;;;;;;;;;;;;;81440:20;:25;;;;;;;;;;;;;;81499:1;81480:4;:16;;;:20;;;81477:303;;;81561:10;81572:4;:16;;;81561:28;;;;;;;;;:::i;:::-;;;81530:65;;;;;;;;:::i;:::-;;;;;;;;;;;;;81518:77;;81649:10;81660:4;:16;;;81649:28;;;;;;;;;:::i;:::-;;;81728:8;81737:4;:16;;;81728:26;;;;;;;;;:::i;:::-;;;81620:147;;;;;;;;;:::i;:::-;;;;;;;;;;;;;81611:156;;81477:303;81790:22;:27;;;;;;;;;;;;;;81832:4;:12;;;81829:289;;;81862:58;;;;;;;;;;;;;;;;;;;81959:6;81945:160;;;;;;;;:::i;:::-;;;;;;;;;;;;;81936:169;;81829:289;82128:20;:476;;;;;;;;;;;;;;;;;;;82639:6;82646;82695:9;82705:4;:17;;;82695:28;;;;;;;;;:::i;:::-;;;82730:8;82771:9;82625:371;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;82616:380;;83029:6;83036:5;83042:4;:14;;;83036:21;;;;;;;;;:::i;:::-;;;83058:5;83064:4;:13;;;83058:20;;;;;;;;;:::i;:::-;;;83079:5;83085:4;:14;;;83079:21;;;;;;;;;:::i;:::-;;;83101:7;83109:4;:15;;;83101:24;;;;;;;;;:::i;:::-;;;83126:7;83134:4;:16;;;83126:25;;;;;;;;;:::i;:::-;;;83152:12;83165:4;:19;;;83152:33;;;;;;;;;:::i;:::-;;;83015:352;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;83008:359;;;;;;81312:2074;;;:::o;16892:178::-;16953:7;10736:13;10874:2;16981:18;:25;17000:5;16981:25;;;;;;;;;;;;;;;;:50;;16980:82;16973:89;;16892:178;;;:::o;37189:2454::-;37262:20;37285:13;;37262:36;;37325:1;37313:8;:13;37309:44;;37335:18;;;;;;;;;;;;;;37309:44;37366:61;37396:1;37400:2;37404:12;37418:8;37366:21;:61::i;:::-;37910:1;10874:2;37880:1;:26;;37879:32;37867:8;:45;37841:18;:22;37860:2;37841:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;38189:139;38226:2;38280:33;38303:1;38307:2;38311:1;38280:14;:33::i;:::-;38247:30;38268:8;38247:20;:30::i;:::-;:66;38189:18;:139::i;:::-;38155:17;:31;38173:12;38155:31;;;;;;;;;;;:173;;;;38345:16;38376:11;38405:8;38390:12;:23;38376:37;;38660:16;38656:2;38652:25;38640:37;;39032:12;38992:8;38951:1;38889:25;38830:1;38769;38742:335;39157:1;39143:12;39139:20;39097:346;39198:3;39189:7;39186:16;39097:346;;39416:7;39406:8;39403:1;39376:25;39373:1;39370;39365:59;39251:1;39242:7;39238:15;39227:26;;39097:346;;;39101:77;39488:1;39476:8;:13;39472:45;;39498:19;;;;;;;;;;;;;;39472:45;39550:3;39534:13;:19;;;;37615:1950;;39575:60;39604:1;39608:2;39612:12;39626:8;39575:20;:60::i;:::-;37251:2392;37189:2454;;:::o;36011:716::-;36174:4;36220:2;36195:45;;;36241:19;:17;:19::i;:::-;36262:4;36268:7;36277:5;36195:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36191:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36495:1;36478:6;:13;:18;36474:235;;36524:40;;;;;;;;;;;;;;36474:235;36667:6;36661:13;36652:6;36648:2;36644:15;36637:38;36191:529;36364:54;;;36354:64;;;:6;:64;;;;36347:71;;;36011:716;;;;;;:::o;49543:1581::-;49608:17;50033:4;50026;50020:11;50016:22;50009:29;;50125:3;50119:4;50112:17;50231:3;50470:5;50452:428;50478:1;50452:428;;;50518:1;50513:3;50509:11;50502:18;;50689:2;50683:4;50679:13;50675:2;50671:22;50666:3;50658:36;50783:2;50777:4;50773:13;50765:21;;50850:4;50452:428;50840:25;50452:428;50456:21;50919:3;50914;50910:13;51034:4;51029:3;51025:14;51018:21;;51099:6;51094:3;51087:19;49647:1470;;49543:1581;;;:::o;63825:3097::-;63883:13;64135:1;64120:4;:11;:16;64116:31;;64138:9;;;;;;;;;;;;;;;;64116:31;64200:19;64222:6;;;;;;;;;;;;;;;;;64200:28;;64639:20;64698:1;64693;64679:4;:11;:15;;;;:::i;:::-;64678:21;;;;:::i;:::-;64673:1;:27;;;;:::i;:::-;64662:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64639:62;;64881:1;64874:5;64870:13;64985:2;64977:6;64973:15;65096:4;65148;65142:11;65136:4;65132:22;65058:1432;65182:6;65173:7;65170:19;65058:1432;;;65288:1;65279:7;65275:15;65264:26;;65327:7;65321:14;65980:4;65972:5;65968:2;65964:14;65960:25;65950:8;65946:40;65940:47;65929:9;65921:67;66034:1;66023:9;66019:17;66006:30;;66126:4;66118:5;66114:2;66110:14;66106:25;66096:8;66092:40;66086:47;66075:9;66067:67;66180:1;66169:9;66165:17;66152:30;;66271:4;66263:5;66260:1;66256:13;66252:24;66242:8;66238:39;66232:46;66221:9;66213:66;66325:1;66314:9;66310:17;66297:30;;66408:4;66401:5;66397:16;66387:8;66383:31;66377:38;66366:9;66358:58;66462:1;66451:9;66447:17;66434:30;;65209:1281;65058:1432;;;65062:107;;66652:1;66645:4;66639:11;66635:19;66673:1;66668:123;;;;66810:1;66805:73;;;;66628:250;;66668:123;66721:4;66717:1;66706:9;66702:17;66694:32;66771:4;66767:1;66756:9;66752:17;66744:32;66668:123;;66805:73;66858:4;66854:1;66843:9;66839:17;66831:32;66628:250;;64767:2122;;66908:6;66901:13;;;;63825:3097;;;;:::o;83580:710::-;83645:13;83672:21;83696:4;:12;;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83672:56;;83764:11;83776:4;:17;;;83764:30;;;;;;;;;:::i;:::-;;;83795:7;83750:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;83740:63;;83840:29;;;;;;;;;;;;;;;;;;83861:7;83840:9;:29::i;:::-;83874:41;;;;;;;;;;;;;;;;;;83891:7;83899:4;:14;;;83891:23;;;;;;;;;:::i;:::-;;;83874:41;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;:41::i;:::-;83920:39;;;;;;;;;;;;;;;;;;83936:7;83944:4;:13;;;83936:22;;;;;;;;;:::i;:::-;;;83920:39;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;:39::i;:::-;83964:41;;;;;;;;;;;;;;;;;;83981:7;83989:4;:14;;;83981:23;;;;;;;;;:::i;:::-;;;83964:41;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;:41::i;:::-;84010:45;;;;;;;;;;;;;;;;;;84028:9;84038:4;:15;;;84028:26;;;;;;;;;:::i;:::-;;;84010:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;:45::i;:::-;84060:47;;;;;;;;;;;;;;;;;;84079:9;84089:4;:16;;;84079:27;;;;;;;;;:::i;:::-;;;84060:47;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;:47::i;:::-;84112:57;;;;;;;;;;;;;;;;;;84134:13;84148:4;:19;;;84134:34;;;;;;;;;:::i;:::-;;;84112:57;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;:57::i;:::-;84174:48;;;;;;;;;;;;;;;;;;84193:10;84204:4;:16;;;84193:28;;;;;;;;;:::i;:::-;;;84174:48;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;:48::i;:::-;84227:49;;;;;;;;;;;;;;;;;;84247:9;84257:4;:17;;;84247:28;;;;;;;;;:::i;:::-;;;84227:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;:49::i;:::-;83822:459;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;83815:466;;;83580:710;;;:::o;52350:190::-;52475:4;52528;52499:25;52512:5;52519:4;52499:12;:25::i;:::-;:33;52492:40;;52350:190;;;;;:::o;48346:147::-;48483:6;48346:147;;;;;:::o;24565:324::-;24635:14;24868:1;24858:8;24855:15;24829:24;24825:46;24815:56;;24565:324;;;:::o;83394:178::-;83472:13;83538:2;83555;83506:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;83499:64;;83394:178;;;;:::o;53217:296::-;53300:7;53320:20;53343:4;53320:27;;53363:9;53358:118;53382:5;:12;53378:1;:16;53358:118;;;53431:33;53441:12;53455:5;53461:1;53455:8;;;;;;;;:::i;:::-;;;;;;;;53431:9;:33::i;:::-;53416:48;;53396:3;;;;;:::i;:::-;;;;53358:118;;;;53493:12;53486:19;;;53217:296;;;;:::o;59424:149::-;59487:7;59518:1;59514;:5;:51;;59545:20;59560:1;59563;59545:14;:20::i;:::-;59514:51;;;59522:20;59537:1;59540;59522:14;:20::i;:::-;59514:51;59507:58;;59424:149;;;;:::o;59581:268::-;59649:13;59756:1;59750:4;59743:15;59785:1;59779:4;59772:15;59826:4;59820;59810:21;59801:30;;59581:268;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798: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:86::-;4925:7;4965:4;4958:5;4954:16;4943:27;;4890:86;;;:::o;4982:118::-;5053:22;5069:5;5053:22;:::i;:::-;5046:5;5043:33;5033:61;;5090:1;5087;5080:12;5033:61;4982:118;:::o;5106:135::-;5150:5;5188:6;5175:20;5166:29;;5204:31;5229:5;5204:31;:::i;:::-;5106:135;;;;:::o;5247:470::-;5313:6;5321;5370:2;5358:9;5349:7;5345:23;5341:32;5338:119;;;5376:79;;:::i;:::-;5338:119;5496:1;5521:53;5566:7;5557:6;5546:9;5542:22;5521:53;:::i;:::-;5511:63;;5467:117;5623:2;5649:51;5692:7;5683:6;5672:9;5668:22;5649:51;:::i;:::-;5639:61;;5594:116;5247:470;;;;;:::o;5723:118::-;5810:24;5828:5;5810:24;:::i;:::-;5805:3;5798:37;5723:118;;:::o;5847:222::-;5940:4;5978:2;5967:9;5963:18;5955:26;;5991:71;6059:1;6048:9;6044:17;6035:6;5991:71;:::i;:::-;5847:222;;;;:::o;6075:619::-;6152:6;6160;6168;6217:2;6205:9;6196:7;6192:23;6188:32;6185:119;;;6223:79;;:::i;:::-;6185:119;6343:1;6368:53;6413:7;6404:6;6393:9;6389:22;6368:53;:::i;:::-;6358:63;;6314:117;6470:2;6496:53;6541:7;6532:6;6521:9;6517:22;6496:53;:::i;:::-;6486:63;;6441:118;6598:2;6624:53;6669:7;6660:6;6649:9;6645:22;6624:53;:::i;:::-;6614:63;;6569:118;6075:619;;;;;:::o;6700:77::-;6737:7;6766:5;6755:16;;6700:77;;;:::o;6783:118::-;6870:24;6888:5;6870:24;:::i;:::-;6865:3;6858:37;6783:118;;:::o;6907:222::-;7000:4;7038:2;7027:9;7023:18;7015:26;;7051:71;7119:1;7108:9;7104:17;7095:6;7051:71;:::i;:::-;6907:222;;;;:::o;7135:117::-;7244:1;7241;7234:12;7258:117;7367:1;7364;7357:12;7381:117;7490:1;7487;7480:12;7518:553;7576:8;7586:6;7636:3;7629:4;7621:6;7617:17;7613:27;7603:122;;7644:79;;:::i;:::-;7603:122;7757:6;7744:20;7734:30;;7787:18;7779:6;7776:30;7773:117;;;7809:79;;:::i;:::-;7773:117;7923:4;7915:6;7911:17;7899:29;;7977:3;7969:4;7961:6;7957:17;7947:8;7943:32;7940:41;7937:128;;;7984:79;;:::i;:::-;7937:128;7518:553;;;;;:::o;8077:529::-;8148:6;8156;8205:2;8193:9;8184:7;8180:23;8176:32;8173:119;;;8211:79;;:::i;:::-;8173:119;8359:1;8348:9;8344:17;8331:31;8389:18;8381:6;8378:30;8375:117;;;8411:79;;:::i;:::-;8375:117;8524:65;8581:7;8572:6;8561:9;8557:22;8524:65;:::i;:::-;8506:83;;;;8302:297;8077:529;;;;;:::o;8612:329::-;8671:6;8720:2;8708:9;8699:7;8695:23;8691:32;8688:119;;;8726:79;;:::i;:::-;8688:119;8846:1;8871:53;8916:7;8907:6;8896:9;8892:22;8871:53;:::i;:::-;8861:63;;8817:117;8612:329;;;;:::o;8947:89::-;8983:7;9023:6;9016:5;9012:18;9001:29;;8947:89;;;:::o;9042:120::-;9114:23;9131:5;9114:23;:::i;:::-;9107:5;9104:34;9094:62;;9152:1;9149;9142:12;9094:62;9042:120;:::o;9168:137::-;9213:5;9251:6;9238:20;9229:29;;9267:32;9293:5;9267:32;:::i;:::-;9168:137;;;;:::o;9311:327::-;9369:6;9418:2;9406:9;9397:7;9393:23;9389:32;9386:119;;;9424:79;;:::i;:::-;9386:119;9544:1;9569:52;9613:7;9604:6;9593:9;9589:22;9569:52;:::i;:::-;9559:62;;9515:116;9311:327;;;;:::o;9644:122::-;9717:24;9735:5;9717:24;:::i;:::-;9710:5;9707:35;9697:63;;9756:1;9753;9746:12;9697:63;9644:122;:::o;9772:139::-;9818:5;9856:6;9843:20;9834:29;;9872:33;9899:5;9872:33;:::i;:::-;9772:139;;;;:::o;9917:329::-;9976:6;10025:2;10013:9;10004:7;10000:23;9996:32;9993:119;;;10031:79;;:::i;:::-;9993:119;10151:1;10176:53;10221:7;10212:6;10201:9;10197:22;10176:53;:::i;:::-;10166:63;;10122:117;9917:329;;;;:::o;10252:116::-;10322:21;10337:5;10322:21;:::i;:::-;10315:5;10312:32;10302:60;;10358:1;10355;10348:12;10302:60;10252:116;:::o;10374:133::-;10417:5;10455:6;10442:20;10433:29;;10471:30;10495:5;10471:30;:::i;:::-;10374:133;;;;:::o;10513:468::-;10578:6;10586;10635:2;10623:9;10614:7;10610:23;10606:32;10603:119;;;10641:79;;:::i;:::-;10603:119;10761:1;10786:53;10831:7;10822:6;10811:9;10807:22;10786:53;:::i;:::-;10776:63;;10732:117;10888:2;10914:50;10956:7;10947:6;10936:9;10932:22;10914:50;:::i;:::-;10904:60;;10859:115;10513:468;;;;;:::o;10987:117::-;11096:1;11093;11086:12;11110:180;11158:77;11155:1;11148:88;11255:4;11252:1;11245:15;11279:4;11276:1;11269:15;11296:281;11379:27;11401:4;11379:27;:::i;:::-;11371:6;11367:40;11509:6;11497:10;11494:22;11473:18;11461:10;11458:34;11455:62;11452:88;;;11520:18;;:::i;:::-;11452:88;11560:10;11556:2;11549:22;11339:238;11296:281;;:::o;11583:129::-;11617:6;11644:20;;:::i;:::-;11634:30;;11673:33;11701:4;11693:6;11673:33;:::i;:::-;11583:129;;;:::o;11718:307::-;11779:4;11869:18;11861:6;11858:30;11855:56;;;11891:18;;:::i;:::-;11855:56;11929:29;11951:6;11929:29;:::i;:::-;11921:37;;12013:4;12007;12003:15;11995:23;;11718:307;;;:::o;12031:146::-;12128:6;12123:3;12118;12105:30;12169:1;12160:6;12155:3;12151:16;12144:27;12031:146;;;:::o;12183:423::-;12260:5;12285:65;12301:48;12342:6;12301:48;:::i;:::-;12285:65;:::i;:::-;12276:74;;12373:6;12366:5;12359:21;12411:4;12404:5;12400:16;12449:3;12440:6;12435:3;12431:16;12428:25;12425:112;;;12456:79;;:::i;:::-;12425:112;12546:54;12593:6;12588:3;12583;12546:54;:::i;:::-;12266:340;12183:423;;;;;:::o;12625:338::-;12680:5;12729:3;12722:4;12714:6;12710:17;12706:27;12696:122;;12737:79;;:::i;:::-;12696:122;12854:6;12841:20;12879:78;12953:3;12945:6;12938:4;12930:6;12926:17;12879:78;:::i;:::-;12870:87;;12686:277;12625:338;;;;:::o;12969:943::-;13064:6;13072;13080;13088;13137:3;13125:9;13116:7;13112:23;13108:33;13105:120;;;13144:79;;:::i;:::-;13105:120;13264:1;13289:53;13334:7;13325:6;13314:9;13310:22;13289:53;:::i;:::-;13279:63;;13235:117;13391:2;13417:53;13462:7;13453:6;13442:9;13438:22;13417:53;:::i;:::-;13407:63;;13362:118;13519:2;13545:53;13590:7;13581:6;13570:9;13566:22;13545:53;:::i;:::-;13535:63;;13490:118;13675:2;13664:9;13660:18;13647:32;13706:18;13698:6;13695:30;13692:117;;;13728:79;;:::i;:::-;13692:117;13833:62;13887:7;13878:6;13867:9;13863:22;13833:62;:::i;:::-;13823:72;;13618:287;12969:943;;;;;;;:::o;13918:115::-;14003:23;14020:5;14003:23;:::i;:::-;13998:3;13991:36;13918:115;;:::o;14039:218::-;14130:4;14168:2;14157:9;14153:18;14145:26;;14181:69;14247:1;14236:9;14232:17;14223:6;14181:69;:::i;:::-;14039:218;;;;:::o;14263:474::-;14331:6;14339;14388:2;14376:9;14367:7;14363:23;14359:32;14356:119;;;14394:79;;:::i;:::-;14356:119;14514:1;14539:53;14584:7;14575:6;14564:9;14560:22;14539:53;:::i;:::-;14529:63;;14485:117;14641:2;14667:53;14712:7;14703:6;14692:9;14688:22;14667:53;:::i;:::-;14657:63;;14612:118;14263:474;;;;;:::o;14760:568::-;14833:8;14843:6;14893:3;14886:4;14878:6;14874:17;14870:27;14860:122;;14901:79;;:::i;:::-;14860:122;15014:6;15001:20;14991:30;;15044:18;15036:6;15033:30;15030:117;;;15066:79;;:::i;:::-;15030:117;15180:4;15172:6;15168:17;15156:29;;15234:3;15226:4;15218:6;15214:17;15204:8;15200:32;15197:41;15194:128;;;15241:79;;:::i;:::-;15194:128;14760:568;;;;;:::o;15334:704::-;15429:6;15437;15445;15494:2;15482:9;15473:7;15469:23;15465:32;15462:119;;;15500:79;;:::i;:::-;15462:119;15620:1;15645:53;15690:7;15681:6;15670:9;15666:22;15645:53;:::i;:::-;15635:63;;15591:117;15775:2;15764:9;15760:18;15747:32;15806:18;15798:6;15795:30;15792:117;;;15828:79;;:::i;:::-;15792:117;15941:80;16013:7;16004:6;15993:9;15989:22;15941:80;:::i;:::-;15923:98;;;;15718:313;15334:704;;;;;:::o;16044:180::-;16092:77;16089:1;16082:88;16189:4;16186:1;16179:15;16213:4;16210:1;16203:15;16230:320;16274:6;16311:1;16305:4;16301:12;16291:22;;16358:1;16352:4;16348:12;16379:18;16369:81;;16435:4;16427:6;16423:17;16413:27;;16369:81;16497:2;16489:6;16486:14;16466:18;16463:38;16460:84;;16516:18;;:::i;:::-;16460:84;16281:269;16230:320;;;:::o;16556:180::-;16604:77;16601:1;16594:88;16701:4;16698:1;16691:15;16725:4;16722:1;16715:15;16742:180;16790:77;16787:1;16780:88;16887:4;16884:1;16877:15;16911:4;16908:1;16901:15;16928:170;16958:1;16975:18;16991:1;16975:18;:::i;:::-;16970:23;;17007:18;17023:1;17007:18;:::i;:::-;17002:23;;17044:1;17034:35;;17049:18;;:::i;:::-;17034:35;17090:1;17087;17083:9;17078:14;;16928:170;;;;:::o;17104:182::-;17244:34;17240:1;17232:6;17228:14;17221:58;17104:182;:::o;17292:366::-;17434:3;17455:67;17519:2;17514:3;17455:67;:::i;:::-;17448:74;;17531:93;17620:3;17531:93;:::i;:::-;17649:2;17644:3;17640:12;17633:19;;17292:366;;;:::o;17664:419::-;17830:4;17868:2;17857:9;17853:18;17845:26;;17917:9;17911:4;17907:20;17903:1;17892:9;17888:17;17881:47;17945:131;18071:4;17945:131;:::i;:::-;17937:139;;17664:419;;;:::o;18089:147::-;18190:11;18227:3;18212:18;;18089:147;;;;:::o;18242:114::-;;:::o;18362:398::-;18521:3;18542:83;18623:1;18618:3;18542:83;:::i;:::-;18535:90;;18634:93;18723:3;18634:93;:::i;:::-;18752:1;18747:3;18743:11;18736:18;;18362:398;;;:::o;18766:379::-;18950:3;18972:147;19115:3;18972:147;:::i;:::-;18965:154;;19136:3;19129:10;;18766:379;;;:::o;19151:97::-;19210:6;19238:3;19228:13;;19151:97;;;;:::o;19254:141::-;19303:4;19326:3;19318:11;;19349:3;19346:1;19339:14;19383:4;19380:1;19370:18;19362:26;;19254:141;;;:::o;19401:93::-;19438:6;19485:2;19480;19473:5;19469:14;19465:23;19455:33;;19401:93;;;:::o;19500:107::-;19544:8;19594:5;19588:4;19584:16;19563:37;;19500:107;;;;:::o;19613:393::-;19682:6;19732:1;19720:10;19716:18;19755:97;19785:66;19774:9;19755:97;:::i;:::-;19873:39;19903:8;19892:9;19873:39;:::i;:::-;19861:51;;19945:4;19941:9;19934:5;19930:21;19921:30;;19994:4;19984:8;19980:19;19973:5;19970:30;19960:40;;19689:317;;19613:393;;;;;:::o;20012:60::-;20040:3;20061:5;20054:12;;20012:60;;;:::o;20078:142::-;20128:9;20161:53;20179:34;20188:24;20206:5;20188:24;:::i;:::-;20179:34;:::i;:::-;20161:53;:::i;:::-;20148:66;;20078:142;;;:::o;20226:75::-;20269:3;20290:5;20283:12;;20226:75;;;:::o;20307:269::-;20417:39;20448:7;20417:39;:::i;:::-;20478:91;20527:41;20551:16;20527:41;:::i;:::-;20519:6;20512:4;20506:11;20478:91;:::i;:::-;20472:4;20465:105;20383:193;20307:269;;;:::o;20582:73::-;20627:3;20582:73;:::o;20661:189::-;20738:32;;:::i;:::-;20779:65;20837:6;20829;20823:4;20779:65;:::i;:::-;20714:136;20661:189;;:::o;20856:186::-;20916:120;20933:3;20926:5;20923:14;20916:120;;;20987:39;21024:1;21017:5;20987:39;:::i;:::-;20960:1;20953:5;20949:13;20940:22;;20916:120;;;20856:186;;:::o;21048:543::-;21149:2;21144:3;21141:11;21138:446;;;21183:38;21215:5;21183:38;:::i;:::-;21267:29;21285:10;21267:29;:::i;:::-;21257:8;21253:44;21450:2;21438:10;21435:18;21432:49;;;21471:8;21456:23;;21432:49;21494:80;21550:22;21568:3;21550:22;:::i;:::-;21540:8;21536:37;21523:11;21494:80;:::i;:::-;21153:431;;21138:446;21048:543;;;:::o;21597:117::-;21651:8;21701:5;21695:4;21691:16;21670:37;;21597:117;;;;:::o;21720:169::-;21764:6;21797:51;21845:1;21841:6;21833:5;21830:1;21826:13;21797:51;:::i;:::-;21793:56;21878:4;21872;21868:15;21858:25;;21771:118;21720:169;;;;:::o;21894:295::-;21970:4;22116:29;22141:3;22135:4;22116:29;:::i;:::-;22108:37;;22178:3;22175:1;22171:11;22165:4;22162:21;22154:29;;21894:295;;;;:::o;22194:1403::-;22318:44;22358:3;22353;22318:44;:::i;:::-;22427:18;22419:6;22416:30;22413:56;;;22449:18;;:::i;:::-;22413:56;22493:38;22525:4;22519:11;22493:38;:::i;:::-;22578:67;22638:6;22630;22624:4;22578:67;:::i;:::-;22672:1;22701:2;22693:6;22690:14;22718:1;22713:632;;;;23389:1;23406:6;23403:84;;;23462:9;23457:3;23453:19;23440:33;23431:42;;23403:84;23513:67;23573:6;23566:5;23513:67;:::i;:::-;23507:4;23500:81;23362:229;22683:908;;22713:632;22765:4;22761:9;22753:6;22749:22;22799:37;22831:4;22799:37;:::i;:::-;22858:1;22872:215;22886:7;22883:1;22880:14;22872:215;;;22972:9;22967:3;22963:19;22950:33;22942:6;22935:49;23023:1;23015:6;23011:14;23001:24;;23070:2;23059:9;23055:18;23042:31;;22909:4;22906:1;22902:12;22897:17;;22872:215;;;23115:6;23106:7;23103:19;23100:186;;;23180:9;23175:3;23171:19;23158:33;23223:48;23265:4;23257:6;23253:17;23242:9;23223:48;:::i;:::-;23215:6;23208:64;23123:163;23100:186;23332:1;23328;23320:6;23316:14;23312:22;23306:4;23299:36;22720:625;;;22683:908;;22293:1304;;;22194:1403;;;:::o;23603:180::-;23651:77;23648:1;23641:88;23748:4;23745:1;23738:15;23772:4;23769:1;23762:15;23789:191;23829:3;23848:20;23866:1;23848:20;:::i;:::-;23843:25;;23882:20;23900:1;23882:20;:::i;:::-;23877:25;;23925:1;23922;23918:9;23911:16;;23946:3;23943:1;23940:10;23937:36;;;23953:18;;:::i;:::-;23937:36;23789:191;;;;:::o;23986:410::-;24026:7;24049:20;24067:1;24049:20;:::i;:::-;24044:25;;24083:20;24101:1;24083:20;:::i;:::-;24078:25;;24138:1;24135;24131:9;24160:30;24178:11;24160:30;:::i;:::-;24149:41;;24339:1;24330:7;24326:15;24323:1;24320:22;24300:1;24293:9;24273:83;24250:139;;24369:18;;:::i;:::-;24250:139;24034:362;23986:410;;;;:::o;24402:148::-;24504:11;24541:3;24526:18;;24402:148;;;;:::o;24580:874::-;24683:3;24720:5;24714:12;24749:36;24775:9;24749:36;:::i;:::-;24801:89;24883:6;24878:3;24801:89;:::i;:::-;24794:96;;24921:1;24910:9;24906:17;24937:1;24932:166;;;;25112:1;25107:341;;;;24899:549;;24932:166;25016:4;25012:9;25001;24997:25;24992:3;24985:38;25078:6;25071:14;25064:22;25056:6;25052:35;25047:3;25043:45;25036:52;;24932:166;;25107:341;25174:38;25206:5;25174:38;:::i;:::-;25234:1;25248:154;25262:6;25259:1;25256:13;25248:154;;;25336:7;25330:14;25326:1;25321:3;25317:11;25310:35;25386:1;25377:7;25373:15;25362:26;;25284:4;25281:1;25277:12;25272:17;;25248:154;;;25431:6;25426:3;25422:16;25415:23;;25114:334;;24899:549;;24687:767;;24580:874;;;;:::o;25460:390::-;25566:3;25594:39;25627:5;25594:39;:::i;:::-;25649:89;25731:6;25726:3;25649:89;:::i;:::-;25642:96;;25747:65;25805:6;25800:3;25793:4;25786:5;25782:16;25747:65;:::i;:::-;25837:6;25832:3;25828:16;25821:23;;25570:280;25460:390;;;;:::o;25856:181::-;26024:6;26019:3;26012:19;25856:181;:::o;26043:693::-;26310:3;26332:92;26420:3;26411:6;26332:92;:::i;:::-;26325:99;;26441:95;26532:3;26523:6;26441:95;:::i;:::-;26434:102;;26546:137;26679:3;26546:137;:::i;:::-;26708:1;26703:3;26699:11;26692:18;;26727:3;26720:10;;26043:693;;;;;:::o;26742:204::-;26911:28;26906:3;26899:41;26742:204;:::o;26952:542::-;27175:3;27190:138;27324:3;27190:138;:::i;:::-;27353:2;27348:3;27344:12;27337:19;;27373:95;27464:3;27455:6;27373:95;:::i;:::-;27366:102;;27485:3;27478:10;;26952:542;;;;:::o;27500:242::-;27669:66;27664:3;27657:79;27500:242;:::o;27748:416::-;27888:66;27884:1;27876:6;27872:14;27865:90;27989:66;27984:2;27976:6;27972:15;27965:91;28090:66;28085:2;28077:6;28073:15;28066:91;27748:416;:::o;28170:402::-;28330:3;28351:85;28433:2;28428:3;28351:85;:::i;:::-;28344:92;;28445:93;28534:3;28445:93;:::i;:::-;28563:2;28558:3;28554:12;28547:19;;28170:402;;;:::o;28578:242::-;28747:66;28742:3;28735:79;28578:242;:::o;28826:241::-;28994:66;28989:3;28982:79;28826:241;:::o;29073:1659::-;29674:3;29689:138;29823:3;29689:138;:::i;:::-;29852:2;29847:3;29843:12;29836:19;;29872:95;29963:3;29954:6;29872:95;:::i;:::-;29865:102;;29984:148;30128:3;29984:148;:::i;:::-;29977:155;;30149:95;30240:3;30231:6;30149:95;:::i;:::-;30142:102;;30254:138;30388:3;30254:138;:::i;:::-;30417:2;30412:3;30408:12;30401:19;;30437:95;30528:3;30519:6;30437:95;:::i;:::-;30430:102;;30542:137;30675:3;30542:137;:::i;:::-;30704:1;30699:3;30695:11;30688:18;;30723:3;30716:10;;29073:1659;;;;;;:::o;30738:207::-;30907:31;30902:3;30895:44;30738:207;:::o;30951:542::-;31174:3;31189:138;31323:3;31189:138;:::i;:::-;31352:2;31347:3;31343:12;31336:19;;31372:95;31463:3;31454:6;31372:95;:::i;:::-;31365:102;;31484:3;31477:10;;30951:542;;;;:::o;31499:94::-;31532:8;31580:5;31576:2;31572:14;31551:35;;31499:94;;;:::o;31599:::-;31638:7;31667:20;31681:5;31667:20;:::i;:::-;31656:31;;31599:94;;;:::o;31699:100::-;31738:7;31767:26;31787:5;31767:26;:::i;:::-;31756:37;;31699:100;;;:::o;31805:157::-;31910:45;31930:24;31948:5;31930:24;:::i;:::-;31910:45;:::i;:::-;31905:3;31898:58;31805:157;;:::o;31968:256::-;32080:3;32095:75;32166:3;32157:6;32095:75;:::i;:::-;32195:2;32190:3;32186:12;32179:19;;32215:3;32208:10;;31968:256;;;;:::o;32230:225::-;32370:34;32366:1;32358:6;32354:14;32347:58;32439:8;32434:2;32426:6;32422:15;32415:33;32230:225;:::o;32461:366::-;32603:3;32624:67;32688:2;32683:3;32624:67;:::i;:::-;32617:74;;32700:93;32789:3;32700:93;:::i;:::-;32818:2;32813:3;32809:12;32802:19;;32461:366;;;:::o;32833:419::-;32999:4;33037:2;33026:9;33022:18;33014:26;;33086:9;33080:4;33076:20;33072:1;33061:9;33057:17;33050:47;33114:131;33240:4;33114:131;:::i;:::-;33106:139;;32833:419;;;:::o;33258:79::-;33297:7;33326:5;33315:16;;33258:79;;;:::o;33343:157::-;33448:45;33468:24;33486:5;33468:24;:::i;:::-;33448:45;:::i;:::-;33443:3;33436:58;33343:157;;:::o;33506:151::-;33646:3;33642:1;33634:6;33630:14;33623:27;33506:151;:::o;33663:400::-;33823:3;33844:84;33926:1;33921:3;33844:84;:::i;:::-;33837:91;;33937:93;34026:3;33937:93;:::i;:::-;34055:1;34050:3;34046:11;34039:18;;33663:400;;;:::o;34069:663::-;34310:3;34325:75;34396:3;34387:6;34325:75;:::i;:::-;34425:2;34420:3;34416:12;34409:19;;34438:75;34509:3;34500:6;34438:75;:::i;:::-;34538:2;34533:3;34529:12;34522:19;;34558:148;34702:3;34558:148;:::i;:::-;34551:155;;34723:3;34716:10;;34069:663;;;;;:::o;34738:176::-;34770:1;34787:20;34805:1;34787:20;:::i;:::-;34782:25;;34821:20;34839:1;34821:20;:::i;:::-;34816:25;;34860:1;34850:35;;34865:18;;:::i;:::-;34850:35;34906:1;34903;34899:9;34894:14;;34738:176;;;;:::o;34920:151::-;35060:3;35056:1;35048:6;35044:14;35037:27;34920:151;:::o;35077:400::-;35237:3;35258:84;35340:1;35335:3;35258:84;:::i;:::-;35251:91;;35351:93;35440:3;35351:93;:::i;:::-;35469:1;35464:3;35460:11;35453:18;;35077:400;;;:::o;35483:663::-;35724:3;35739:75;35810:3;35801:6;35739:75;:::i;:::-;35839:2;35834:3;35830:12;35823:19;;35852:75;35923:3;35914:6;35852:75;:::i;:::-;35952:2;35947:3;35943:12;35936:19;;35972:148;36116:3;35972:148;:::i;:::-;35965:155;;36137:3;36130:10;;35483:663;;;;;:::o;36152:151::-;36292:3;36288:1;36280:6;36276:14;36269:27;36152:151;:::o;36309:400::-;36469:3;36490:84;36572:1;36567:3;36490:84;:::i;:::-;36483:91;;36583:93;36672:3;36583:93;:::i;:::-;36701:1;36696:3;36692:11;36685:18;;36309:400;;;:::o;36715:663::-;36956:3;36971:75;37042:3;37033:6;36971:75;:::i;:::-;37071:2;37066:3;37062:12;37055:19;;37084:75;37155:3;37146:6;37084:75;:::i;:::-;37184:2;37179:3;37175:12;37168:19;;37204:148;37348:3;37204:148;:::i;:::-;37197:155;;37369:3;37362:10;;36715:663;;;;;:::o;37384:151::-;37524:3;37520:1;37512:6;37508:14;37501:27;37384:151;:::o;37541:400::-;37701:3;37722:84;37804:1;37799:3;37722:84;:::i;:::-;37715:91;;37815:93;37904:3;37815:93;:::i;:::-;37933:1;37928:3;37924:11;37917:18;;37541:400;;;:::o;37947:663::-;38188:3;38203:75;38274:3;38265:6;38203:75;:::i;:::-;38303:2;38298:3;38294:12;38287:19;;38316:75;38387:3;38378:6;38316:75;:::i;:::-;38416:2;38411:3;38407:12;38400:19;;38436:148;38580:3;38436:148;:::i;:::-;38429:155;;38601:3;38594:10;;37947:663;;;;;:::o;38616:151::-;38756:3;38752:1;38744:6;38740:14;38733:27;38616:151;:::o;38773:400::-;38933:3;38954:84;39036:1;39031:3;38954:84;:::i;:::-;38947:91;;39047:93;39136:3;39047:93;:::i;:::-;39165:1;39160:3;39156:11;39149:18;;38773:400;;;:::o;39179:663::-;39420:3;39435:75;39506:3;39497:6;39435:75;:::i;:::-;39535:2;39530:3;39526:12;39519:19;;39548:75;39619:3;39610:6;39548:75;:::i;:::-;39648:2;39643:3;39639:12;39632:19;;39668:148;39812:3;39668:148;:::i;:::-;39661:155;;39833:3;39826:10;;39179:663;;;;;:::o;39848:151::-;39988:3;39984:1;39976:6;39972:14;39965:27;39848:151;:::o;40005:400::-;40165:3;40186:84;40268:1;40263:3;40186:84;:::i;:::-;40179:91;;40279:93;40368:3;40279:93;:::i;:::-;40397:1;40392:3;40388:11;40381:18;;40005:400;;;:::o;40411:663::-;40652:3;40667:75;40738:3;40729:6;40667:75;:::i;:::-;40767:2;40762:3;40758:12;40751:19;;40780:75;40851:3;40842:6;40780:75;:::i;:::-;40880:2;40875:3;40871:12;40864:19;;40900:148;41044:3;40900:148;:::i;:::-;40893:155;;41065:3;41058:10;;40411:663;;;;;:::o;41080:151::-;41220:3;41216:1;41208:6;41204:14;41197:27;41080:151;:::o;41237:400::-;41397:3;41418:84;41500:1;41495:3;41418:84;:::i;:::-;41411:91;;41511:93;41600:3;41511:93;:::i;:::-;41629:1;41624:3;41620:11;41613:18;;41237:400;;;:::o;41643:663::-;41884:3;41899:75;41970:3;41961:6;41899:75;:::i;:::-;41999:2;41994:3;41990:12;41983:19;;42012:75;42083:3;42074:6;42012:75;:::i;:::-;42112:2;42107:3;42103:12;42096:19;;42132:148;42276:3;42132:148;:::i;:::-;42125:155;;42297:3;42290:10;;41643:663;;;;;:::o;42312:151::-;42452:3;42448:1;42440:6;42436:14;42429:27;42312:151;:::o;42469:400::-;42629:3;42650:84;42732:1;42727:3;42650:84;:::i;:::-;42643:91;;42743:93;42832:3;42743:93;:::i;:::-;42861:1;42856:3;42852:11;42845:18;;42469:400;;;:::o;42875:663::-;43116:3;43131:75;43202:3;43193:6;43131:75;:::i;:::-;43231:2;43226:3;43222:12;43215:19;;43244:75;43315:3;43306:6;43244:75;:::i;:::-;43344:2;43339:3;43335:12;43328:19;;43364:148;43508:3;43364:148;:::i;:::-;43357:155;;43529:3;43522:10;;42875:663;;;;;:::o;43544:151::-;43684:3;43680:1;43672:6;43668:14;43661:27;43544:151;:::o;43701:400::-;43861:3;43882:84;43964:1;43959:3;43882:84;:::i;:::-;43875:91;;43975:93;44064:3;43975:93;:::i;:::-;44093:1;44088:3;44084:11;44077:18;;43701:400;;;:::o;44107:663::-;44348:3;44363:75;44434:3;44425:6;44363:75;:::i;:::-;44463:2;44458:3;44454:12;44447:19;;44476:75;44547:3;44538:6;44476:75;:::i;:::-;44576:2;44571:3;44567:12;44560:19;;44596:148;44740:3;44596:148;:::i;:::-;44589:155;;44761:3;44754:10;;44107:663;;;;;:::o;44776:196::-;44945:16;44940:3;44933:29;44776:196;:::o;44982:179::-;45150:4;45145:3;45138:17;44982:179;:::o;45167:800::-;45477:3;45492:138;45626:3;45492:138;:::i;:::-;45655:2;45650:3;45646:12;45639:19;;45675:92;45763:3;45754:6;45675:92;:::i;:::-;45668:99;;45777:137;45910:3;45777:137;:::i;:::-;45939:1;45934:3;45930:11;45923:18;;45958:3;45951:10;;45167:800;;;;:::o;45973:242::-;46142:66;46137:3;46130:79;45973:242;:::o;46221:315::-;46361:66;46357:1;46349:6;46345:14;46338:90;46462:66;46457:2;46449:6;46445:15;46438:91;46221:315;:::o;46542:402::-;46702:3;46723:85;46805:2;46800:3;46723:85;:::i;:::-;46716:92;;46817:93;46906:3;46817:93;:::i;:::-;46935:2;46930:3;46926:12;46919:19;;46542:402;;;:::o;46950:186::-;47118:11;47113:3;47106:24;46950:186;:::o;47142:1220::-;47598:3;47613:138;47747:3;47613:138;:::i;:::-;47776:2;47771:3;47767:12;47760:19;;47796:92;47884:3;47875:6;47796:92;:::i;:::-;47789:99;;47905:148;48049:3;47905:148;:::i;:::-;47898:155;;48070:92;48158:3;48149:6;48070:92;:::i;:::-;48063:99;;48172:137;48305:3;48172:137;:::i;:::-;48334:1;48329:3;48325:11;48318:18;;48353:3;48346:10;;47142:1220;;;;;:::o;48368:563::-;48508:66;48504:1;48496:6;48492:14;48485:90;48609:66;48604:2;48596:6;48592:15;48585:91;48710:66;48705:2;48697:6;48693:15;48686:91;48811:66;48806:2;48798:6;48794:15;48787:91;48913:10;48907:3;48899:6;48895:16;48888:36;48368:563;:::o;48937:404::-;49097:3;49118:86;49200:3;49195;49118:86;:::i;:::-;49111:93;;49213;49302:3;49213:93;:::i;:::-;49331:3;49326;49322:13;49315:20;;48937:404;;;:::o;49347:541::-;49580:3;49602:95;49693:3;49684:6;49602:95;:::i;:::-;49595:102;;49714:148;49858:3;49714:148;:::i;:::-;49707:155;;49879:3;49872:10;;49347:541;;;;:::o;49894:226::-;50034:34;50030:1;50022:6;50018:14;50011:58;50103:9;50098:2;50090:6;50086:15;50079:34;49894:226;:::o;50126:402::-;50286:3;50307:85;50389:2;50384:3;50307:85;:::i;:::-;50300:92;;50401:93;50490:3;50401:93;:::i;:::-;50519:2;50514:3;50510:12;50503:19;;50126:402;;;:::o;50534:180::-;50702:5;50697:3;50690:18;50534:180;:::o;50720:207::-;50889:31;50884:3;50877:44;50720:207;:::o;50933:587::-;51073:34;51069:1;51061:6;51057:14;51050:58;51142:34;51137:2;51129:6;51125:15;51118:59;51211:34;51206:2;51198:6;51194:15;51187:59;51280:34;51275:2;51267:6;51263:15;51256:59;51350:34;51344:3;51336:6;51332:16;51325:60;51420:34;51414:3;51406:6;51402:16;51395:60;51490:22;51484:3;51476:6;51472:16;51465:48;50933:587;:::o;51526:404::-;51686:3;51707:86;51789:3;51784;51707:86;:::i;:::-;51700:93;;51802;51891:3;51802:93;:::i;:::-;51920:3;51915;51911:13;51904:20;;51526:404;;;:::o;51936:1972::-;52640:3;52662:95;52753:3;52744:6;52662:95;:::i;:::-;52655:102;;52774:95;52865:3;52856:6;52774:95;:::i;:::-;52767:102;;52886:148;53030:3;52886:148;:::i;:::-;52879:155;;53051:92;53139:3;53130:6;53051:92;:::i;:::-;53044:99;;53153:137;53286:3;53153:137;:::i;:::-;53315:1;53310:3;53306:11;53299:18;;53334:95;53425:3;53416:6;53334:95;:::i;:::-;53327:102;;53439:138;53573:3;53439:138;:::i;:::-;53602:2;53597:3;53593:12;53586:19;;53622:95;53713:3;53704:6;53622:95;:::i;:::-;53615:102;;53734:148;53878:3;53734:148;:::i;:::-;53727:155;;53899:3;53892:10;;51936:1972;;;;;;;;:::o;53914:515::-;54054:34;54050:1;54042:6;54038:14;54031:58;54123:34;54118:2;54110:6;54106:15;54099:59;54192:34;54187:2;54179:6;54175:15;54168:59;54261:34;54256:2;54248:6;54244:15;54237:59;54331:34;54325:3;54317:6;54313:16;54306:60;54401:20;54395:3;54387:6;54383:16;54376:46;53914:515;:::o;54435:404::-;54595:3;54616:86;54698:3;54693;54616:86;:::i;:::-;54609:93;;54711;54800:3;54711:93;:::i;:::-;54829:3;54824;54820:13;54813:20;;54435:404;;;:::o;54845:1465::-;55348:3;55370:95;55461:3;55452:6;55370:95;:::i;:::-;55363:102;;55482:92;55570:3;55561:6;55482:92;:::i;:::-;55475:99;;55591:92;55679:3;55670:6;55591:92;:::i;:::-;55584:99;;55700:92;55788:3;55779:6;55700:92;:::i;:::-;55693:99;;55809:92;55897:3;55888:6;55809:92;:::i;:::-;55802:99;;55918:92;56006:3;55997:6;55918:92;:::i;:::-;55911:99;;56027:92;56115:3;56106:6;56027:92;:::i;:::-;56020:99;;56136:148;56280:3;56136:148;:::i;:::-;56129:155;;56301:3;56294:10;;54845:1465;;;;;;;;;;:::o;56316:98::-;56367:6;56401:5;56395:12;56385:22;;56316:98;;;:::o;56420:168::-;56503:11;56537:6;56532:3;56525:19;56577:4;56572:3;56568:14;56553:29;;56420:168;;;;:::o;56594:373::-;56680:3;56708:38;56740:5;56708:38;:::i;:::-;56762:70;56825:6;56820:3;56762:70;:::i;:::-;56755:77;;56841:65;56899:6;56894:3;56887:4;56880:5;56876:16;56841:65;:::i;:::-;56931:29;56953:6;56931:29;:::i;:::-;56926:3;56922:39;56915:46;;56684:283;56594:373;;;;:::o;56973:640::-;57168:4;57206:3;57195:9;57191:19;57183:27;;57220:71;57288:1;57277:9;57273:17;57264:6;57220:71;:::i;:::-;57301:72;57369:2;57358:9;57354:18;57345:6;57301:72;:::i;:::-;57383;57451:2;57440:9;57436:18;57427:6;57383:72;:::i;:::-;57502:9;57496:4;57492:20;57487:2;57476:9;57472:18;57465:48;57530:76;57601:4;57592:6;57530:76;:::i;:::-;57522:84;;56973:640;;;;;;;:::o;57619:141::-;57675:5;57706:6;57700:13;57691:22;;57722:32;57748:5;57722:32;:::i;:::-;57619:141;;;;:::o;57766:349::-;57835:6;57884:2;57872:9;57863:7;57859:23;57855:32;57852:119;;;57890:79;;:::i;:::-;57852:119;58010:1;58035:63;58090:7;58081:6;58070:9;58066:22;58035:63;:::i;:::-;58025:73;;57981:127;57766:349;;;;:::o;58121:185::-;58161:1;58178:20;58196:1;58178:20;:::i;:::-;58173:25;;58212:20;58230:1;58212:20;:::i;:::-;58207:25;;58251:1;58241:35;;58256:18;;:::i;:::-;58241:35;58298:1;58295;58291:9;58286:14;;58121:185;;;;:::o;58312:429::-;58489:3;58511:92;58599:3;58590:6;58511:92;:::i;:::-;58504:99;;58620:95;58711:3;58702:6;58620:95;:::i;:::-;58613:102;;58732:3;58725:10;;58312:429;;;;;:::o;58747:178::-;58915:3;58910;58903:16;58747:178;:::o;58931:::-;59099:3;59094;59087:16;58931:178;:::o;59115:::-;59283:3;59278;59271:16;59115:178;:::o;59299:4195::-;60715:3;60730:137;60863:3;60730:137;:::i;:::-;60892:1;60887:3;60883:11;60876:18;;60911:95;61002:3;60993:6;60911:95;:::i;:::-;60904:102;;61016:137;61149:3;61016:137;:::i;:::-;61178:1;61173:3;61169:11;61162:18;;61197:95;61288:3;61279:6;61197:95;:::i;:::-;61190:102;;61302:137;61435:3;61302:137;:::i;:::-;61464:1;61459:3;61455:11;61448:18;;61483:95;61574:3;61565:6;61483:95;:::i;:::-;61476:102;;61588:137;61721:3;61588:137;:::i;:::-;61750:1;61745:3;61741:11;61734:18;;61769:95;61860:3;61851:6;61769:95;:::i;:::-;61762:102;;61874:137;62007:3;61874:137;:::i;:::-;62036:1;62031:3;62027:11;62020:18;;62055:95;62146:3;62137:6;62055:95;:::i;:::-;62048:102;;62160:137;62293:3;62160:137;:::i;:::-;62322:1;62317:3;62313:11;62306:18;;62341:95;62432:3;62423:6;62341:95;:::i;:::-;62334:102;;62446:137;62579:3;62446:137;:::i;:::-;62608:1;62603:3;62599:11;62592:18;;62627:95;62718:3;62709:6;62627:95;:::i;:::-;62620:102;;62732:137;62865:3;62732:137;:::i;:::-;62894:1;62889:3;62885:11;62878:18;;62913:95;63004:3;62995:6;62913:95;:::i;:::-;62906:102;;63018:137;63151:3;63018:137;:::i;:::-;63180:1;63175:3;63171:11;63164:18;;63199:95;63290:3;63281:6;63199:95;:::i;:::-;63192:102;;63304:137;63437:3;63304:137;:::i;:::-;63466:1;63461:3;63457:11;63450:18;;63485:3;63478:10;;59299:4195;;;;;;;;;;;;:::o;63500:242::-;63669:66;63664:3;63657:79;63500:242;:::o;63748:::-;63917:66;63912:3;63905:79;63748:242;:::o;63996:1233::-;64448:3;64463:138;64597:3;64463:138;:::i;:::-;64626:2;64621:3;64617:12;64610:19;;64646:95;64737:3;64728:6;64646:95;:::i;:::-;64639:102;;64751:138;64885:3;64751:138;:::i;:::-;64914:2;64909:3;64905:12;64898:19;;64934:95;65025:3;65016:6;64934:95;:::i;:::-;64927:102;;65039:137;65172:3;65039:137;:::i;:::-;65201:1;65196:3;65192:11;65185:18;;65220:3;65213:10;;63996:1233;;;;;:::o;65235:233::-;65274:3;65297:24;65315:5;65297:24;:::i;:::-;65288:33;;65343:66;65336:5;65333:77;65330:103;;65413:18;;:::i;:::-;65330:103;65460:1;65453:5;65449:13;65442:20;;65235:233;;;:::o
Swarm Source
ipfs://12f333c9a99c28a9700cc3bc139a4067b8da2210a8b05160ecf4c9741878ac4b
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.