ERC-721
Overview
Max Total Supply
222 Elf
Holders
48
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
5 ElfLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
Elf
Compiler Version
v0.8.16+commit.07a7930e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-01-27 */ // SPDX-License-Identifier: MIT // // // ▄████████ ▄█ ▄█ █▄ ▄████████ ███▄▄▄▄ ███ ▄████████ ▄█ ▄████████ ▄████████ // ███ ███ ███ ███ ███ ███ ███ ███▀▀▀██▄ ▀█████████▄ ███ ███ ███ ███ ███ ███ ███ // ███ █▀ ███ ███ ███ ███ █▀ ███ ███ ▀███▀▀██ ███ ███ ███ ███ █▀ ███ █▀ // ▄███▄▄▄ ███ ███ ███ ▄███▄▄▄ ███ ███ ███ ▀ ███ ███ ███ ▄███▄▄▄ ███ //▀▀███▀▀▀ ███ ███ ███ ▀▀███▀▀▀ ███ ███ ███ ▀███████████ ███ ▀▀███▀▀▀ ▀███████████ // ███ █▄ ███ ███ ███ ███ █▄ ███ ███ ███ ███ ███ ███ ███ █▄ ███ // ███ ███ ███▌ ▄ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███▌ ▄ ███ ███ ▄█ ███ // ██████████ █████▄▄██ ▀██████▀ ██████████ ▀█ █▀ ▄████▀ ███ █▀ █████▄▄██ ██████████ ▄████████▀ // ▀ ▀ // // pragma solidity ^0.8.0; abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } pragma solidity ^0.8.0; abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor() { _transferOwnership(_msgSender()); } modifier onlyOwner() { _checkOwner(); _; } function owner() public view virtual returns (address) { return _owner; } function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } pragma solidity ^0.8.0; abstract contract ReentrancyGuard { uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; _status = _NOT_ENTERED; } } pragma solidity ^0.8.0; library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; function toString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } pragma solidity ^0.8.0; library EnumerableSet { struct Set { // Storage of set values bytes32[] _values; mapping(bytes32 => uint256) _indexes; } function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); set._indexes[value] = set._values.length; return true; } else { return false; } } function _remove(Set storage set, bytes32 value) private returns (bool) { uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; set._values[toDeleteIndex] = lastValue; set._indexes[lastValue] = valueIndex; } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } function _length(Set storage set) private view returns (uint256) { return set._values.length; } function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } struct Bytes32Set { Set _inner; } function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } struct AddressSet { Set _inner; } function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; assembly { result := store } return result; } struct UintSet { Set _inner; } function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } } pragma solidity ^0.8.4; interface IERC721A { error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error BalanceQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerQueryForNonexistentToken(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); error MintERC2309QuantityExceedsLimit(); error OwnershipNotInitializedForExtraData(); struct TokenOwnership { address addr; uint64 startTimestamp; bool burned; uint24 extraData; } function totalSupply() external view returns (uint256); function supportsInterface(bytes4 interfaceId) external view returns (bool); event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); event ApprovalForAll(address indexed owner, address indexed operator, bool approved); function balanceOf(address owner) external view returns (uint256 balance); function ownerOf(uint256 tokenId) external view returns (address owner); function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external payable; function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; function transferFrom( address from, address to, uint256 tokenId ) external payable; function approve(address to, uint256 tokenId) external payable; function setApprovalForAll(address operator, bool _approved) external; function getApproved(uint256 tokenId) external view returns (address operator); function isApprovedForAll(address owner, address operator) external view returns (bool); function name() external view returns (string memory); function symbol() external view returns (string memory); function tokenURI(uint256 tokenId) external view returns (string memory); event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } pragma solidity ^0.8.4; interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } contract ERC721A is IERC721A { struct TokenApprovalRef { address value; } uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; uint256 private constant _BITPOS_NUMBER_MINTED = 64; uint256 private constant _BITPOS_NUMBER_BURNED = 128; uint256 private constant _BITPOS_AUX = 192; uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; uint256 private constant _BITPOS_START_TIMESTAMP = 160; uint256 private constant _BITMASK_BURNED = 1 << 224; uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; uint256 private constant _BITPOS_EXTRA_DATA = 232; uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; uint256 private _currentIndex; uint256 private _burnCounter; string private _name; string private _symbol; mapping(uint256 => uint256) private _packedOwnerships; mapping(address => uint256) private _packedAddressData; mapping(uint256 => TokenApprovalRef) private _tokenApprovals; mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } function _startTokenId() internal view virtual returns (uint256) { return 0; } function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } function totalSupply() public view virtual override returns (uint256) { unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } function _totalMinted() internal view virtual returns (uint256) { unchecked { return _currentIndex - _startTokenId(); } } function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } 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; } function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == 0x01ffc9a7 || interfaceId == 0x80ac58cd || interfaceId == 0x5b5e139f; } function name() public view virtual override returns (string memory) { return _name; } function symbol() public view virtual override returns (string memory) { return _symbol; } 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))) : ''; } function _baseURI() internal view virtual returns (string memory) { return ''; } function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; if (packed & _BITMASK_BURNED == 0) { while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } 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); } 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)) } } 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)) } } function approve(address to, uint256 tokenId) public payable virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } function setApprovalForAll(address operator, bool approved) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } 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. } function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { owner := and(owner, _BITMASK_ADDRESS) msgSender := and(msgSender, _BITMASK_ADDRESS) result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } function transferFrom( address from, address to, uint256 tokenId ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); assembly { if approvedAddress { sstore(approvedAddressSlot, 0) } } unchecked { --_packedAddressData[from]; ++_packedAddressData[to]; _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; if (_packedOwnerships[nextTokenId] == 0) { if (nextTokenId != _currentIndex) { _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} 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)) } } } } function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); unchecked { _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; assembly { toMasked := and(to, _BITMASK_ADDRESS) log4( 0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, startTokenId ) for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } 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); unchecked { _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 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); } 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(); } } } function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } 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) { if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); assembly { if approvedAddress { sstore(approvedAddressSlot, 0) } } unchecked { _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; if (_packedOwnerships[nextTokenId] == 0) { if (nextTokenId != _currentIndex) { _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); unchecked { _burnCounter++; } } function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} 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; } function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { let m := add(mload(0x40), 0xa0) mstore(0x40, m) str := sub(m, 0x20) mstore(str, 0) let end := str for { let temp := value } 1 {} { str := sub(str, 1) mstore8(str, add(48, mod(temp, 10))) temp := div(temp, 10) if iszero(temp) { break } } let length := sub(end, str) str := sub(str, 0x20) mstore(str, length) } } } pragma solidity ^0.8.13; contract OperatorFilterer { error OperatorNotAllowed(address operator); IOperatorFilterRegistry constant operatorFilterRegistry = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { if (address(operatorFilterRegistry).code.length > 0) { if (subscribe) { operatorFilterRegistry.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { operatorFilterRegistry.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { operatorFilterRegistry.register(address(this)); } } } } modifier onlyAllowedOperator() virtual { if (address(operatorFilterRegistry).code.length > 0) { if (!operatorFilterRegistry.isOperatorAllowed(address(this), msg.sender)) { revert OperatorNotAllowed(msg.sender); } } _; } } pragma solidity ^0.8.13; contract DefaultOperatorFilterer is OperatorFilterer { address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6); constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {} } pragma solidity ^0.8.13; interface IOperatorFilterRegistry { function isOperatorAllowed(address registrant, address operator) external returns (bool); function register(address registrant) external; function registerAndSubscribe(address registrant, address subscription) external; function registerAndCopyEntries(address registrant, address registrantToCopy) external; function updateOperator(address registrant, address operator, bool filtered) external; function updateOperators(address registrant, address[] calldata operators, bool filtered) external; function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; function subscribe(address registrant, address registrantToSubscribe) external; function unsubscribe(address registrant, bool copyExistingEntries) external; function subscriptionOf(address addr) external returns (address registrant); function subscribers(address registrant) external returns (address[] memory); function subscriberAt(address registrant, uint256 index) external returns (address); function copyEntriesOf(address registrant, address registrantToCopy) external; function isOperatorFiltered(address registrant, address operator) external returns (bool); function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); function filteredOperators(address addr) external returns (address[] memory); function filteredCodeHashes(address addr) external returns (bytes32[] memory); function filteredOperatorAt(address registrant, uint256 index) external returns (address); function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); function isRegistered(address addr) external returns (bool); function codeHashOf(address addr) external returns (bytes32); } pragma solidity ^0.8.4; interface IERC721ABurnable is IERC721A { function burn(uint256 tokenId) external; } pragma solidity ^0.8.4; abstract contract ERC721ABurnable is ERC721A, IERC721ABurnable { function burn(uint256 tokenId) public virtual override { _burn(tokenId, true); } } pragma solidity ^0.8.16; contract Elf is Ownable, ERC721A, ReentrancyGuard, ERC721ABurnable, DefaultOperatorFilterer{ string public CONTRACT_URI = ""; mapping(address => uint) public userHasMinted; bool public REVEALED; string public UNREVEALED_URI = ""; string public BASE_URI = ""; bool public isPublicMintEnabled = false; uint public COLLECTION_SIZE = 3333; uint public MINT_PRICE = 0.0016 ether; uint public MAX_BATCH_SIZE = 21; uint public SUPPLY_PER_WALLET = 21; uint public FREE_SUPPLY_PER_WALLET = 1; constructor() ERC721A("Elven Tales", "Elf") {} function MintVip(uint256 quantity, address receiver) public onlyOwner { require( totalSupply() + quantity <= COLLECTION_SIZE, "No more tokens in stock!" ); _safeMint(receiver, quantity); } modifier callerIsUser() { require(tx.origin == msg.sender, "The caller is another contract"); _; } function getPrice(uint quantity) public view returns(uint){ uint price; uint free = FREE_SUPPLY_PER_WALLET - userHasMinted[msg.sender]; if (quantity >= free) { price = (MINT_PRICE) * (quantity - free); } else { price = 0; } return price; } function FreeMint(uint quantity) external payable callerIsUser nonReentrant { uint price; uint free = FREE_SUPPLY_PER_WALLET - userHasMinted[msg.sender]; if (quantity >= free) { price = (MINT_PRICE) * (quantity - free); userHasMinted[msg.sender] = userHasMinted[msg.sender] + free; } else { price = 0; userHasMinted[msg.sender] = userHasMinted[msg.sender] + quantity; } require(isPublicMintEnabled, "Elfs not ready yet!"); require(totalSupply() + quantity <= COLLECTION_SIZE, "No more Tokens!"); require(balanceOf(msg.sender) + quantity <= SUPPLY_PER_WALLET, "Tried to total mint Elfs per wallet over limit"); require(quantity <= MAX_BATCH_SIZE, "Tried to mint Elfs over limit, retry with reduced quantity"); require(msg.value >= price, "Must send enough eth"); _safeMint(msg.sender, quantity); if (msg.value > price) { payable(msg.sender).transfer(msg.value - price); } } function mint(uint quantity) external payable callerIsUser nonReentrant { uint price; uint free = FREE_SUPPLY_PER_WALLET - userHasMinted[msg.sender]; if (quantity >= free) { price = (MINT_PRICE) * (quantity - free); userHasMinted[msg.sender] = userHasMinted[msg.sender] + free; } else { price = 0; userHasMinted[msg.sender] = userHasMinted[msg.sender] + quantity; } require(isPublicMintEnabled, "Elfs not ready yet!"); require(totalSupply() + quantity <= COLLECTION_SIZE, "No more Elfs!"); require(balanceOf(msg.sender) + quantity <= SUPPLY_PER_WALLET, "Tried to total mint Elfs per wallet over limit"); require(quantity <= MAX_BATCH_SIZE, "Tried to mint Elfs over limit, retry with reduced quantity"); require(msg.value >= price, "Must send enough eth"); _safeMint(msg.sender, quantity); if (msg.value > price) { payable(msg.sender).transfer(msg.value - price); } } function withdrawFunds() external onlyOwner nonReentrant { (bool success, ) = msg.sender.call{value: address(this).balance}(""); require(success, "Transfer failed."); } function setPublicMintEnabled() public onlyOwner { isPublicMintEnabled = !isPublicMintEnabled; } function setBaseURI(bool _revealed, string memory _baseURI) public onlyOwner { BASE_URI = _baseURI; REVEALED = _revealed; } function contractURI() public view returns (string memory) { return CONTRACT_URI; } function setContractURI(string memory _contractURI) public onlyOwner { CONTRACT_URI = _contractURI; } function setCOLLECTIONsIZE(uint256 _new) external onlyOwner { COLLECTION_SIZE = _new; } function setPrice(uint256 _newPrice) external onlyOwner { MINT_PRICE = _newPrice; } function set_FREE_SUPPLY_PER_WALLET(uint256 _new) external onlyOwner { FREE_SUPPLY_PER_WALLET = _new; } function set_SUPPLY_PER_WALLET(uint256 _new) external onlyOwner { SUPPLY_PER_WALLET = _new; } function set_MAX_BATCH_SIZE(uint256 _new) external onlyOwner { MAX_BATCH_SIZE = _new; } function transferFrom(address from, address to, uint256 tokenId) public payable override (ERC721A, IERC721A) onlyAllowedOperator { super.transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public payable override (ERC721A, IERC721A) onlyAllowedOperator { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public payable override (ERC721A, IERC721A) onlyAllowedOperator { super.safeTransferFrom(from, to, tokenId, data); } function tokenURI(uint256 _tokenId) public view override (ERC721A, IERC721A) returns (string memory) { if (REVEALED) { return string(abi.encodePacked(BASE_URI, Strings.toString(_tokenId))); } else { return UNREVEALED_URI; } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BASE_URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"COLLECTION_SIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CONTRACT_URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FREE_SUPPLY_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"FreeMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"MAX_BATCH_SIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"MintVip","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"REVEALED","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SUPPLY_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNREVEALED_URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"isPublicMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_revealed","type":"bool"},{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new","type":"uint256"}],"name":"setCOLLECTIONsIZE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_contractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPublicMintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new","type":"uint256"}],"name":"set_FREE_SUPPLY_PER_WALLET","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new","type":"uint256"}],"name":"set_MAX_BATCH_SIZE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new","type":"uint256"}],"name":"set_SUPPLY_PER_WALLET","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userHasMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260405180602001604052806000815250600a9081620000249190620006df565b5060405180602001604052806000815250600d9081620000459190620006df565b5060405180602001604052806000815250600e9081620000669190620006df565b506000600f60006101000a81548160ff021916908315150217905550610d056010556605af3107a40000601155601560125560156013556001601455348015620000af57600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600b81526020017f456c76656e2054616c65730000000000000000000000000000000000000000008152506040518060400160405280600381526020017f456c66000000000000000000000000000000000000000000000000000000000081525062000153620001476200039460201b60201c565b6200039c60201b60201c565b8160039081620001649190620006df565b508060049081620001769190620006df565b50620001876200046060201b60201c565b6001819055505050600160098190555060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200038c57801562000252576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b8152600401620002189291906200080b565b600060405180830381600087803b1580156200023357600080fd5b505af115801562000248573d6000803e3d6000fd5b505050506200038b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146200030c576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620002d29291906200080b565b600060405180830381600087803b158015620002ed57600080fd5b505af115801562000302573d6000803e3d6000fd5b505050506200038a565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b815260040162000355919062000838565b600060405180830381600087803b1580156200037057600080fd5b505af115801562000385573d6000803e3d6000fd5b505050505b5b5b505062000855565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620004e757607f821691505b602082108103620004fd57620004fc6200049f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005677fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000528565b62000573868362000528565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620005c0620005ba620005b4846200058b565b62000595565b6200058b565b9050919050565b6000819050919050565b620005dc836200059f565b620005f4620005eb82620005c7565b84845462000535565b825550505050565b600090565b6200060b620005fc565b62000618818484620005d1565b505050565b5b8181101562000640576200063460008262000601565b6001810190506200061e565b5050565b601f8211156200068f57620006598162000503565b620006648462000518565b8101602085101562000674578190505b6200068c620006838562000518565b8301826200061d565b50505b505050565b600082821c905092915050565b6000620006b46000198460080262000694565b1980831691505092915050565b6000620006cf8383620006a1565b9150826002028217905092915050565b620006ea8262000465565b67ffffffffffffffff81111562000706576200070562000470565b5b620007128254620004ce565b6200071f82828562000644565b600060209050601f83116001811462000757576000841562000742578287015190505b6200074e8582620006c1565b865550620007be565b601f198416620007678662000503565b60005b8281101562000791578489015182556001820191506020850194506020810190506200076a565b86831015620007b15784890151620007ad601f891682620006a1565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620007f382620007c6565b9050919050565b6200080581620007e6565b82525050565b6000604082019050620008226000830185620007fa565b620008316020830184620007fa565b9392505050565b60006020820190506200084f6000830184620007fa565b92915050565b61453580620008656000396000f3fe60806040526004361061025c5760003560e01c806391b7f5ed11610144578063c002d23d116100b6578063e113ad951161007a578063e113ad951461085e578063e757223014610887578063e8a3d485146108c4578063e985e9c5146108ef578063e9d541b01461092c578063f2fde38b146109555761025c565b8063c002d23d14610775578063c87b56dd146107a0578063cfdbf254146107dd578063d8258d9514610808578063dbddb26a146108335761025c565b8063a22cb46511610108578063a22cb465146106a9578063a4cdd719146106d2578063a76a9587146106e9578063a9527e8214610714578063b88d4fde1461073d578063bdfaa084146107595761025c565b806391b7f5ed146105e7578063938e3d7b1461061057806395d89b41146106395780639e1f39d614610664578063a0712d681461068d5761025c565b806324600fc3116101dd57806356b4f673116101a157806356b4f673146104d55780635fe75587146105005780636352211e1461052b57806370a0823114610568578063715018a6146105a55780638da5cb5b146105bc5761025c565b806324600fc314610425578063336f5ec31461043c57806342842e0e1461046557806342966c6814610481578063507862d1146104aa5761025c565b80631422374f116102245780631422374f1461034d57806318160ddd146103785780631d188d7a146103a35780631d985778146103cc57806323b872dd146104095761025c565b80630116bc2d1461026157806301ffc9a71461028c57806306fdde03146102c9578063081812fc146102f4578063095ea7b314610331575b600080fd5b34801561026d57600080fd5b5061027661097e565b604051610283919061310a565b60405180910390f35b34801561029857600080fd5b506102b360048036038101906102ae9190613191565b610991565b6040516102c0919061310a565b60405180910390f35b3480156102d557600080fd5b506102de610a23565b6040516102eb919061324e565b60405180910390f35b34801561030057600080fd5b5061031b600480360381019061031691906132a6565b610ab5565b6040516103289190613314565b60405180910390f35b61034b6004803603810190610346919061335b565b610b34565b005b34801561035957600080fd5b50610362610c78565b60405161036f91906133aa565b60405180910390f35b34801561038457600080fd5b5061038d610c7e565b60405161039a91906133aa565b60405180910390f35b3480156103af57600080fd5b506103ca60048036038101906103c591906133c5565b610c95565b005b3480156103d857600080fd5b506103f360048036038101906103ee9190613405565b610d02565b60405161040091906133aa565b60405180910390f35b610423600480360381019061041e9190613432565b610d1a565b005b34801561043157600080fd5b5061043a610e26565b005b34801561044857600080fd5b50610463600480360381019061045e91906132a6565b610f32565b005b61047f600480360381019061047a9190613432565b610f44565b005b34801561048d57600080fd5b506104a860048036038101906104a391906132a6565b611050565b005b3480156104b657600080fd5b506104bf61105e565b6040516104cc919061324e565b60405180910390f35b3480156104e157600080fd5b506104ea6110ec565b6040516104f7919061324e565b60405180910390f35b34801561050c57600080fd5b5061051561117a565b60405161052291906133aa565b60405180910390f35b34801561053757600080fd5b50610552600480360381019061054d91906132a6565b611180565b60405161055f9190613314565b60405180910390f35b34801561057457600080fd5b5061058f600480360381019061058a9190613405565b611192565b60405161059c91906133aa565b60405180910390f35b3480156105b157600080fd5b506105ba61124a565b005b3480156105c857600080fd5b506105d161125e565b6040516105de9190613314565b60405180910390f35b3480156105f357600080fd5b5061060e600480360381019061060991906132a6565b611287565b005b34801561061c57600080fd5b50610637600480360381019061063291906135ba565b611299565b005b34801561064557600080fd5b5061064e6112b4565b60405161065b919061324e565b60405180910390f35b34801561067057600080fd5b5061068b6004803603810190610686919061362f565b611346565b005b6106a760048036038101906106a291906132a6565b61137c565b005b3480156106b557600080fd5b506106d060048036038101906106cb919061368b565b6117c9565b005b3480156106de57600080fd5b506106e76118d4565b005b3480156106f557600080fd5b506106fe611908565b60405161070b919061310a565b60405180910390f35b34801561072057600080fd5b5061073b600480360381019061073691906132a6565b61191b565b005b6107576004803603810190610752919061376c565b61192d565b005b610773600480360381019061076e91906132a6565b611a3b565b005b34801561078157600080fd5b5061078a611e88565b60405161079791906133aa565b60405180910390f35b3480156107ac57600080fd5b506107c760048036038101906107c291906132a6565b611e8e565b6040516107d4919061324e565b60405180910390f35b3480156107e957600080fd5b506107f2611f6a565b6040516107ff91906133aa565b60405180910390f35b34801561081457600080fd5b5061081d611f70565b60405161082a91906133aa565b60405180910390f35b34801561083f57600080fd5b50610848611f76565b604051610855919061324e565b60405180910390f35b34801561086a57600080fd5b50610885600480360381019061088091906132a6565b612004565b005b34801561089357600080fd5b506108ae60048036038101906108a991906132a6565b612016565b6040516108bb91906133aa565b60405180910390f35b3480156108d057600080fd5b506108d96120a0565b6040516108e6919061324e565b60405180910390f35b3480156108fb57600080fd5b50610916600480360381019061091191906137ef565b612132565b604051610923919061310a565b60405180910390f35b34801561093857600080fd5b50610953600480360381019061094e91906132a6565b6121c6565b005b34801561096157600080fd5b5061097c60048036038101906109779190613405565b6121d8565b005b600f60009054906101000a900460ff1681565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109ec57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a1c5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610a329061385e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5e9061385e565b8015610aab5780601f10610a8057610100808354040283529160200191610aab565b820191906000526020600020905b815481529060010190602001808311610a8e57829003601f168201915b5050505050905090565b6000610ac08261225b565b610af6576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b3f82611180565b90508073ffffffffffffffffffffffffffffffffffffffff16610b606122ba565b73ffffffffffffffffffffffffffffffffffffffff1614610bc357610b8c81610b876122ba565b612132565b610bc2576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60145481565b6000610c886122c2565b6002546001540303905090565b610c9d6122c7565b60105482610ca9610c7e565b610cb391906138be565b1115610cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ceb9061393e565b60405180910390fd5b610cfe8183612345565b5050565b600b6020528060005260406000206000915090505481565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610e16576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610d9192919061395e565b6020604051808303816000875af1158015610db0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd4919061399c565b610e1557336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610e0c9190613314565b60405180910390fd5b5b610e21838383612363565b505050565b610e2e6122c7565b600260095403610e73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6a90613a15565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610ea190613a66565b60006040518083038185875af1925050503d8060008114610ede576040519150601f19603f3d011682016040523d82523d6000602084013e610ee3565b606091505b5050905080610f27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1e90613ac7565b60405180910390fd5b506001600981905550565b610f3a6122c7565b8060128190555050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611040576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610fbb92919061395e565b6020604051808303816000875af1158015610fda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ffe919061399c565b61103f57336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016110369190613314565b60405180910390fd5b5b61104b838383612685565b505050565b61105b8160016126a5565b50565b600d805461106b9061385e565b80601f01602080910402602001604051908101604052809291908181526020018280546110979061385e565b80156110e45780601f106110b9576101008083540402835291602001916110e4565b820191906000526020600020905b8154815290600101906020018083116110c757829003601f168201915b505050505081565b600a80546110f99061385e565b80601f01602080910402602001604051908101604052809291908181526020018280546111259061385e565b80156111725780601f1061114757610100808354040283529160200191611172565b820191906000526020600020905b81548152906001019060200180831161115557829003601f168201915b505050505081565b60135481565b600061118b826128f7565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111f9576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6112526122c7565b61125c60006129c3565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61128f6122c7565b8060118190555050565b6112a16122c7565b80600a90816112b09190613c93565b5050565b6060600480546112c39061385e565b80601f01602080910402602001604051908101604052809291908181526020018280546112ef9061385e565b801561133c5780601f106113115761010080835404028352916020019161133c565b820191906000526020600020905b81548152906001019060200180831161131f57829003601f168201915b5050505050905090565b61134e6122c7565b80600e908161135d9190613c93565b5081600c60006101000a81548160ff0219169083151502179055505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146113ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e190613db1565b60405180910390fd5b60026009540361142f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142690613a15565b60405180910390fd5b6002600981905550600080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546014546114879190613dd1565b905080831061153e57808361149c9190613dd1565b6011546114a99190613e05565b915080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546114f691906138be565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506115d1565b6000915082600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461158d91906138be565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600f60009054906101000a900460ff16611620576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161790613eab565b60405180910390fd5b6010548361162c610c7e565b61163691906138be565b1115611677576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166e90613f17565b60405180910390fd5b6013548361168433611192565b61168e91906138be565b11156116cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c690613fa9565b60405180910390fd5b601254831115611714576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170b9061403b565b60405180910390fd5b81341015611757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174e906140a7565b60405180910390fd5b6117613384612345565b813411156117bc573373ffffffffffffffffffffffffffffffffffffffff166108fc833461178f9190613dd1565b9081150290604051600060405180830381858888f193505050501580156117ba573d6000803e3d6000fd5b505b5050600160098190555050565b80600860006117d66122ba565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118836122ba565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118c8919061310a565b60405180910390a35050565b6118dc6122c7565b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b600c60009054906101000a900460ff1681565b6119236122c7565b8060148190555050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611a29576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016119a492919061395e565b6020604051808303816000875af11580156119c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e7919061399c565b611a2857336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611a1f9190613314565b60405180910390fd5b5b611a3584848484612a87565b50505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611aa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa090613db1565b60405180910390fd5b600260095403611aee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae590613a15565b60405180910390fd5b6002600981905550600080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601454611b469190613dd1565b9050808310611bfd578083611b5b9190613dd1565b601154611b689190613e05565b915080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611bb591906138be565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611c90565b6000915082600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c4c91906138be565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600f60009054906101000a900460ff16611cdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd690613eab565b60405180910390fd5b60105483611ceb610c7e565b611cf591906138be565b1115611d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2d90614113565b60405180910390fd5b60135483611d4333611192565b611d4d91906138be565b1115611d8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8590613fa9565b60405180910390fd5b601254831115611dd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dca9061403b565b60405180910390fd5b81341015611e16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0d906140a7565b60405180910390fd5b611e203384612345565b81341115611e7b573373ffffffffffffffffffffffffffffffffffffffff166108fc8334611e4e9190613dd1565b9081150290604051600060405180830381858888f19350505050158015611e79573d6000803e3d6000fd5b505b5050600160098190555050565b60115481565b6060600c60009054906101000a900460ff1615611ed757600e611eb083612afa565b604051602001611ec19291906141f2565b6040516020818303038152906040529050611f65565b600d8054611ee49061385e565b80601f0160208091040260200160405190810160405280929190818152602001828054611f109061385e565b8015611f5d5780601f10611f3257610100808354040283529160200191611f5d565b820191906000526020600020905b815481529060010190602001808311611f4057829003601f168201915b505050505090505b919050565b60125481565b60105481565b600e8054611f839061385e565b80601f0160208091040260200160405190810160405280929190818152602001828054611faf9061385e565b8015611ffc5780601f10611fd157610100808354040283529160200191611ffc565b820191906000526020600020905b815481529060010190602001808311611fdf57829003601f168201915b505050505081565b61200c6122c7565b8060138190555050565b6000806000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546014546120689190613dd1565b905080841061209157808461207d9190613dd1565b60115461208a9190613e05565b9150612096565b600091505b8192505050919050565b6060600a80546120af9061385e565b80601f01602080910402602001604051908101604052809291908181526020018280546120db9061385e565b80156121285780601f106120fd57610100808354040283529160200191612128565b820191906000526020600020905b81548152906001019060200180831161210b57829003601f168201915b5050505050905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6121ce6122c7565b8060108190555050565b6121e06122c7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361224f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224690614288565b60405180910390fd5b612258816129c3565b50565b6000816122666122c2565b11158015612275575060015482105b80156122b3575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b6122cf612c5a565b73ffffffffffffffffffffffffffffffffffffffff166122ed61125e565b73ffffffffffffffffffffffffffffffffffffffff1614612343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233a906142f4565b60405180910390fd5b565b61235f828260405180602001604052806000815250612c62565b5050565b600061236e826128f7565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146123d5576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806123e184612d00565b915091506123f781876123f26122ba565b612d27565b6124435761240c866124076122ba565b612132565b612442576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036124a9576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124b68686866001612d6b565b80156124c157600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061258f8561256b888887612d71565b7c020000000000000000000000000000000000000000000000000000000017612d99565b600560008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036126155760006001850190506000600560008381526020019081526020016000205403612613576001548114612612578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461267d8686866001612dc4565b505050505050565b6126a08383836040518060200160405280600081525061192d565b505050565b60006126b0836128f7565b905060008190506000806126c386612d00565b91509150841561272c576126df81846126da6122ba565b612d27565b61272b576126f4836126ef6122ba565b612132565b61272a576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b61273a836000886001612d6b565b801561274557600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506127ed836127aa85600088612d71565b7c02000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000001717612d99565b600560008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036128735760006001870190506000600560008381526020019081526020016000205403612871576001548114612870578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128dd836000886001612dc4565b600260008154809291906001019190505550505050505050565b600080829050806129066122c2565b1161298c5760015481101561298b5760006005600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612989575b6000810361297f576005600083600190039350838152602001908152602001600020549050612955565b80925050506129be565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612a92848484610d1a565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612af457612abd84848484612dca565b612af3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606060008203612b41576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c55565b600082905060005b60008214612b73578080612b5c90614314565b915050600a82612b6c919061438b565b9150612b49565b60008167ffffffffffffffff811115612b8f57612b8e61348f565b5b6040519080825280601f01601f191660200182016040528015612bc15781602001600182028036833780820191505090505b5090505b60008514612c4e57600182612bda9190613dd1565b9150600a85612be991906143bc565b6030612bf591906138be565b60f81b818381518110612c0b57612c0a6143ed565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c47919061438b565b9450612bc5565b8093505050505b919050565b600033905090565b612c6c8383612f1a565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612cfb5760006001549050600083820390505b612cad6000868380600101945086612dca565b612ce3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612c9a578160015414612cf857600080fd5b50505b505050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612d888686846130d6565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612df06122ba565b8786866040518563ffffffff1660e01b8152600401612e129493929190614471565b6020604051808303816000875af1925050508015612e4e57506040513d601f19601f82011682018060405250810190612e4b91906144d2565b60015b612ec7573d8060008114612e7e576040519150601f19603f3d011682016040523d82523d6000602084013e612e83565b606091505b506000815103612ebf576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6000600154905060008203612f5b576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f686000848385612d6b565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612fdf83612fd06000866000612d71565b612fd9856130df565b17612d99565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461308057808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050613045565b50600082036130bb576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060018190555050506130d16000848385612dc4565b505050565b60009392505050565b60006001821460e11b9050919050565b60008115159050919050565b613104816130ef565b82525050565b600060208201905061311f60008301846130fb565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61316e81613139565b811461317957600080fd5b50565b60008135905061318b81613165565b92915050565b6000602082840312156131a7576131a661312f565b5b60006131b58482850161317c565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156131f85780820151818401526020810190506131dd565b60008484015250505050565b6000601f19601f8301169050919050565b6000613220826131be565b61322a81856131c9565b935061323a8185602086016131da565b61324381613204565b840191505092915050565b600060208201905081810360008301526132688184613215565b905092915050565b6000819050919050565b61328381613270565b811461328e57600080fd5b50565b6000813590506132a08161327a565b92915050565b6000602082840312156132bc576132bb61312f565b5b60006132ca84828501613291565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006132fe826132d3565b9050919050565b61330e816132f3565b82525050565b60006020820190506133296000830184613305565b92915050565b613338816132f3565b811461334357600080fd5b50565b6000813590506133558161332f565b92915050565b600080604083850312156133725761337161312f565b5b600061338085828601613346565b925050602061339185828601613291565b9150509250929050565b6133a481613270565b82525050565b60006020820190506133bf600083018461339b565b92915050565b600080604083850312156133dc576133db61312f565b5b60006133ea85828601613291565b92505060206133fb85828601613346565b9150509250929050565b60006020828403121561341b5761341a61312f565b5b600061342984828501613346565b91505092915050565b60008060006060848603121561344b5761344a61312f565b5b600061345986828701613346565b935050602061346a86828701613346565b925050604061347b86828701613291565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6134c782613204565b810181811067ffffffffffffffff821117156134e6576134e561348f565b5b80604052505050565b60006134f9613125565b905061350582826134be565b919050565b600067ffffffffffffffff8211156135255761352461348f565b5b61352e82613204565b9050602081019050919050565b82818337600083830152505050565b600061355d6135588461350a565b6134ef565b9050828152602081018484840111156135795761357861348a565b5b61358484828561353b565b509392505050565b600082601f8301126135a1576135a0613485565b5b81356135b184826020860161354a565b91505092915050565b6000602082840312156135d0576135cf61312f565b5b600082013567ffffffffffffffff8111156135ee576135ed613134565b5b6135fa8482850161358c565b91505092915050565b61360c816130ef565b811461361757600080fd5b50565b60008135905061362981613603565b92915050565b600080604083850312156136465761364561312f565b5b60006136548582860161361a565b925050602083013567ffffffffffffffff81111561367557613674613134565b5b6136818582860161358c565b9150509250929050565b600080604083850312156136a2576136a161312f565b5b60006136b085828601613346565b92505060206136c18582860161361a565b9150509250929050565b600067ffffffffffffffff8211156136e6576136e561348f565b5b6136ef82613204565b9050602081019050919050565b600061370f61370a846136cb565b6134ef565b90508281526020810184848401111561372b5761372a61348a565b5b61373684828561353b565b509392505050565b600082601f83011261375357613752613485565b5b81356137638482602086016136fc565b91505092915050565b600080600080608085870312156137865761378561312f565b5b600061379487828801613346565b94505060206137a587828801613346565b93505060406137b687828801613291565b925050606085013567ffffffffffffffff8111156137d7576137d6613134565b5b6137e38782880161373e565b91505092959194509250565b600080604083850312156138065761380561312f565b5b600061381485828601613346565b925050602061382585828601613346565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061387657607f821691505b6020821081036138895761388861382f565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006138c982613270565b91506138d483613270565b92508282019050808211156138ec576138eb61388f565b5b92915050565b7f4e6f206d6f726520746f6b656e7320696e2073746f636b210000000000000000600082015250565b60006139286018836131c9565b9150613933826138f2565b602082019050919050565b600060208201905081810360008301526139578161391b565b9050919050565b60006040820190506139736000830185613305565b6139806020830184613305565b9392505050565b60008151905061399681613603565b92915050565b6000602082840312156139b2576139b161312f565b5b60006139c084828501613987565b91505092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006139ff601f836131c9565b9150613a0a826139c9565b602082019050919050565b60006020820190508181036000830152613a2e816139f2565b9050919050565b600081905092915050565b50565b6000613a50600083613a35565b9150613a5b82613a40565b600082019050919050565b6000613a7182613a43565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b6000613ab16010836131c9565b9150613abc82613a7b565b602082019050919050565b60006020820190508181036000830152613ae081613aa4565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613b497fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613b0c565b613b538683613b0c565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613b90613b8b613b8684613270565b613b6b565b613270565b9050919050565b6000819050919050565b613baa83613b75565b613bbe613bb682613b97565b848454613b19565b825550505050565b600090565b613bd3613bc6565b613bde818484613ba1565b505050565b5b81811015613c0257613bf7600082613bcb565b600181019050613be4565b5050565b601f821115613c4757613c1881613ae7565b613c2184613afc565b81016020851015613c30578190505b613c44613c3c85613afc565b830182613be3565b50505b505050565b600082821c905092915050565b6000613c6a60001984600802613c4c565b1980831691505092915050565b6000613c838383613c59565b9150826002028217905092915050565b613c9c826131be565b67ffffffffffffffff811115613cb557613cb461348f565b5b613cbf825461385e565b613cca828285613c06565b600060209050601f831160018114613cfd5760008415613ceb578287015190505b613cf58582613c77565b865550613d5d565b601f198416613d0b86613ae7565b60005b82811015613d3357848901518255600182019150602085019450602081019050613d0e565b86831015613d505784890151613d4c601f891682613c59565b8355505b6001600288020188555050505b505050505050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b6000613d9b601e836131c9565b9150613da682613d65565b602082019050919050565b60006020820190508181036000830152613dca81613d8e565b9050919050565b6000613ddc82613270565b9150613de783613270565b9250828203905081811115613dff57613dfe61388f565b5b92915050565b6000613e1082613270565b9150613e1b83613270565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e5457613e5361388f565b5b828202905092915050565b7f456c6673206e6f74207265616479207965742100000000000000000000000000600082015250565b6000613e956013836131c9565b9150613ea082613e5f565b602082019050919050565b60006020820190508181036000830152613ec481613e88565b9050919050565b7f4e6f206d6f726520456c66732100000000000000000000000000000000000000600082015250565b6000613f01600d836131c9565b9150613f0c82613ecb565b602082019050919050565b60006020820190508181036000830152613f3081613ef4565b9050919050565b7f547269656420746f20746f74616c206d696e7420456c6673207065722077616c60008201527f6c6574206f766572206c696d6974000000000000000000000000000000000000602082015250565b6000613f93602e836131c9565b9150613f9e82613f37565b604082019050919050565b60006020820190508181036000830152613fc281613f86565b9050919050565b7f547269656420746f206d696e7420456c6673206f766572206c696d69742c207260008201527f6574727920776974682072656475636564207175616e74697479000000000000602082015250565b6000614025603a836131c9565b915061403082613fc9565b604082019050919050565b6000602082019050818103600083015261405481614018565b9050919050565b7f4d7573742073656e6420656e6f75676820657468000000000000000000000000600082015250565b60006140916014836131c9565b915061409c8261405b565b602082019050919050565b600060208201905081810360008301526140c081614084565b9050919050565b7f4e6f206d6f726520546f6b656e73210000000000000000000000000000000000600082015250565b60006140fd600f836131c9565b9150614108826140c7565b602082019050919050565b6000602082019050818103600083015261412c816140f0565b9050919050565b600081905092915050565b6000815461414b8161385e565b6141558186614133565b945060018216600081146141705760018114614185576141b8565b60ff19831686528115158202860193506141b8565b61418e85613ae7565b60005b838110156141b057815481890152600182019150602081019050614191565b838801955050505b50505092915050565b60006141cc826131be565b6141d68185614133565b93506141e68185602086016131da565b80840191505092915050565b60006141fe828561413e565b915061420a82846141c1565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006142726026836131c9565b915061427d82614216565b604082019050919050565b600060208201905081810360008301526142a181614265565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006142de6020836131c9565b91506142e9826142a8565b602082019050919050565b6000602082019050818103600083015261430d816142d1565b9050919050565b600061431f82613270565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036143515761435061388f565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061439682613270565b91506143a183613270565b9250826143b1576143b061435c565b5b828204905092915050565b60006143c782613270565b91506143d283613270565b9250826143e2576143e161435c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006144438261441c565b61444d8185614427565b935061445d8185602086016131da565b61446681613204565b840191505092915050565b60006080820190506144866000830187613305565b6144936020830186613305565b6144a0604083018561339b565b81810360608301526144b28184614438565b905095945050505050565b6000815190506144cc81613165565b92915050565b6000602082840312156144e8576144e761312f565b5b60006144f6848285016144bd565b9150509291505056fea26469706673582212206e52bb806055b7069bc3ecd1e7765aba7caccea0f098f65906eecef36adb499a64736f6c63430008100033
Deployed Bytecode
0x60806040526004361061025c5760003560e01c806391b7f5ed11610144578063c002d23d116100b6578063e113ad951161007a578063e113ad951461085e578063e757223014610887578063e8a3d485146108c4578063e985e9c5146108ef578063e9d541b01461092c578063f2fde38b146109555761025c565b8063c002d23d14610775578063c87b56dd146107a0578063cfdbf254146107dd578063d8258d9514610808578063dbddb26a146108335761025c565b8063a22cb46511610108578063a22cb465146106a9578063a4cdd719146106d2578063a76a9587146106e9578063a9527e8214610714578063b88d4fde1461073d578063bdfaa084146107595761025c565b806391b7f5ed146105e7578063938e3d7b1461061057806395d89b41146106395780639e1f39d614610664578063a0712d681461068d5761025c565b806324600fc3116101dd57806356b4f673116101a157806356b4f673146104d55780635fe75587146105005780636352211e1461052b57806370a0823114610568578063715018a6146105a55780638da5cb5b146105bc5761025c565b806324600fc314610425578063336f5ec31461043c57806342842e0e1461046557806342966c6814610481578063507862d1146104aa5761025c565b80631422374f116102245780631422374f1461034d57806318160ddd146103785780631d188d7a146103a35780631d985778146103cc57806323b872dd146104095761025c565b80630116bc2d1461026157806301ffc9a71461028c57806306fdde03146102c9578063081812fc146102f4578063095ea7b314610331575b600080fd5b34801561026d57600080fd5b5061027661097e565b604051610283919061310a565b60405180910390f35b34801561029857600080fd5b506102b360048036038101906102ae9190613191565b610991565b6040516102c0919061310a565b60405180910390f35b3480156102d557600080fd5b506102de610a23565b6040516102eb919061324e565b60405180910390f35b34801561030057600080fd5b5061031b600480360381019061031691906132a6565b610ab5565b6040516103289190613314565b60405180910390f35b61034b6004803603810190610346919061335b565b610b34565b005b34801561035957600080fd5b50610362610c78565b60405161036f91906133aa565b60405180910390f35b34801561038457600080fd5b5061038d610c7e565b60405161039a91906133aa565b60405180910390f35b3480156103af57600080fd5b506103ca60048036038101906103c591906133c5565b610c95565b005b3480156103d857600080fd5b506103f360048036038101906103ee9190613405565b610d02565b60405161040091906133aa565b60405180910390f35b610423600480360381019061041e9190613432565b610d1a565b005b34801561043157600080fd5b5061043a610e26565b005b34801561044857600080fd5b50610463600480360381019061045e91906132a6565b610f32565b005b61047f600480360381019061047a9190613432565b610f44565b005b34801561048d57600080fd5b506104a860048036038101906104a391906132a6565b611050565b005b3480156104b657600080fd5b506104bf61105e565b6040516104cc919061324e565b60405180910390f35b3480156104e157600080fd5b506104ea6110ec565b6040516104f7919061324e565b60405180910390f35b34801561050c57600080fd5b5061051561117a565b60405161052291906133aa565b60405180910390f35b34801561053757600080fd5b50610552600480360381019061054d91906132a6565b611180565b60405161055f9190613314565b60405180910390f35b34801561057457600080fd5b5061058f600480360381019061058a9190613405565b611192565b60405161059c91906133aa565b60405180910390f35b3480156105b157600080fd5b506105ba61124a565b005b3480156105c857600080fd5b506105d161125e565b6040516105de9190613314565b60405180910390f35b3480156105f357600080fd5b5061060e600480360381019061060991906132a6565b611287565b005b34801561061c57600080fd5b50610637600480360381019061063291906135ba565b611299565b005b34801561064557600080fd5b5061064e6112b4565b60405161065b919061324e565b60405180910390f35b34801561067057600080fd5b5061068b6004803603810190610686919061362f565b611346565b005b6106a760048036038101906106a291906132a6565b61137c565b005b3480156106b557600080fd5b506106d060048036038101906106cb919061368b565b6117c9565b005b3480156106de57600080fd5b506106e76118d4565b005b3480156106f557600080fd5b506106fe611908565b60405161070b919061310a565b60405180910390f35b34801561072057600080fd5b5061073b600480360381019061073691906132a6565b61191b565b005b6107576004803603810190610752919061376c565b61192d565b005b610773600480360381019061076e91906132a6565b611a3b565b005b34801561078157600080fd5b5061078a611e88565b60405161079791906133aa565b60405180910390f35b3480156107ac57600080fd5b506107c760048036038101906107c291906132a6565b611e8e565b6040516107d4919061324e565b60405180910390f35b3480156107e957600080fd5b506107f2611f6a565b6040516107ff91906133aa565b60405180910390f35b34801561081457600080fd5b5061081d611f70565b60405161082a91906133aa565b60405180910390f35b34801561083f57600080fd5b50610848611f76565b604051610855919061324e565b60405180910390f35b34801561086a57600080fd5b50610885600480360381019061088091906132a6565b612004565b005b34801561089357600080fd5b506108ae60048036038101906108a991906132a6565b612016565b6040516108bb91906133aa565b60405180910390f35b3480156108d057600080fd5b506108d96120a0565b6040516108e6919061324e565b60405180910390f35b3480156108fb57600080fd5b50610916600480360381019061091191906137ef565b612132565b604051610923919061310a565b60405180910390f35b34801561093857600080fd5b50610953600480360381019061094e91906132a6565b6121c6565b005b34801561096157600080fd5b5061097c60048036038101906109779190613405565b6121d8565b005b600f60009054906101000a900460ff1681565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109ec57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a1c5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610a329061385e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5e9061385e565b8015610aab5780601f10610a8057610100808354040283529160200191610aab565b820191906000526020600020905b815481529060010190602001808311610a8e57829003601f168201915b5050505050905090565b6000610ac08261225b565b610af6576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b3f82611180565b90508073ffffffffffffffffffffffffffffffffffffffff16610b606122ba565b73ffffffffffffffffffffffffffffffffffffffff1614610bc357610b8c81610b876122ba565b612132565b610bc2576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60145481565b6000610c886122c2565b6002546001540303905090565b610c9d6122c7565b60105482610ca9610c7e565b610cb391906138be565b1115610cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ceb9061393e565b60405180910390fd5b610cfe8183612345565b5050565b600b6020528060005260406000206000915090505481565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610e16576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610d9192919061395e565b6020604051808303816000875af1158015610db0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd4919061399c565b610e1557336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610e0c9190613314565b60405180910390fd5b5b610e21838383612363565b505050565b610e2e6122c7565b600260095403610e73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6a90613a15565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610ea190613a66565b60006040518083038185875af1925050503d8060008114610ede576040519150601f19603f3d011682016040523d82523d6000602084013e610ee3565b606091505b5050905080610f27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1e90613ac7565b60405180910390fd5b506001600981905550565b610f3a6122c7565b8060128190555050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611040576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610fbb92919061395e565b6020604051808303816000875af1158015610fda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ffe919061399c565b61103f57336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016110369190613314565b60405180910390fd5b5b61104b838383612685565b505050565b61105b8160016126a5565b50565b600d805461106b9061385e565b80601f01602080910402602001604051908101604052809291908181526020018280546110979061385e565b80156110e45780601f106110b9576101008083540402835291602001916110e4565b820191906000526020600020905b8154815290600101906020018083116110c757829003601f168201915b505050505081565b600a80546110f99061385e565b80601f01602080910402602001604051908101604052809291908181526020018280546111259061385e565b80156111725780601f1061114757610100808354040283529160200191611172565b820191906000526020600020905b81548152906001019060200180831161115557829003601f168201915b505050505081565b60135481565b600061118b826128f7565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111f9576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6112526122c7565b61125c60006129c3565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61128f6122c7565b8060118190555050565b6112a16122c7565b80600a90816112b09190613c93565b5050565b6060600480546112c39061385e565b80601f01602080910402602001604051908101604052809291908181526020018280546112ef9061385e565b801561133c5780601f106113115761010080835404028352916020019161133c565b820191906000526020600020905b81548152906001019060200180831161131f57829003601f168201915b5050505050905090565b61134e6122c7565b80600e908161135d9190613c93565b5081600c60006101000a81548160ff0219169083151502179055505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146113ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e190613db1565b60405180910390fd5b60026009540361142f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142690613a15565b60405180910390fd5b6002600981905550600080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546014546114879190613dd1565b905080831061153e57808361149c9190613dd1565b6011546114a99190613e05565b915080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546114f691906138be565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506115d1565b6000915082600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461158d91906138be565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600f60009054906101000a900460ff16611620576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161790613eab565b60405180910390fd5b6010548361162c610c7e565b61163691906138be565b1115611677576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166e90613f17565b60405180910390fd5b6013548361168433611192565b61168e91906138be565b11156116cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c690613fa9565b60405180910390fd5b601254831115611714576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170b9061403b565b60405180910390fd5b81341015611757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174e906140a7565b60405180910390fd5b6117613384612345565b813411156117bc573373ffffffffffffffffffffffffffffffffffffffff166108fc833461178f9190613dd1565b9081150290604051600060405180830381858888f193505050501580156117ba573d6000803e3d6000fd5b505b5050600160098190555050565b80600860006117d66122ba565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118836122ba565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118c8919061310a565b60405180910390a35050565b6118dc6122c7565b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b600c60009054906101000a900460ff1681565b6119236122c7565b8060148190555050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611a29576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016119a492919061395e565b6020604051808303816000875af11580156119c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e7919061399c565b611a2857336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611a1f9190613314565b60405180910390fd5b5b611a3584848484612a87565b50505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611aa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa090613db1565b60405180910390fd5b600260095403611aee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae590613a15565b60405180910390fd5b6002600981905550600080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601454611b469190613dd1565b9050808310611bfd578083611b5b9190613dd1565b601154611b689190613e05565b915080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611bb591906138be565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611c90565b6000915082600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611c4c91906138be565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600f60009054906101000a900460ff16611cdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd690613eab565b60405180910390fd5b60105483611ceb610c7e565b611cf591906138be565b1115611d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2d90614113565b60405180910390fd5b60135483611d4333611192565b611d4d91906138be565b1115611d8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8590613fa9565b60405180910390fd5b601254831115611dd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dca9061403b565b60405180910390fd5b81341015611e16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0d906140a7565b60405180910390fd5b611e203384612345565b81341115611e7b573373ffffffffffffffffffffffffffffffffffffffff166108fc8334611e4e9190613dd1565b9081150290604051600060405180830381858888f19350505050158015611e79573d6000803e3d6000fd5b505b5050600160098190555050565b60115481565b6060600c60009054906101000a900460ff1615611ed757600e611eb083612afa565b604051602001611ec19291906141f2565b6040516020818303038152906040529050611f65565b600d8054611ee49061385e565b80601f0160208091040260200160405190810160405280929190818152602001828054611f109061385e565b8015611f5d5780601f10611f3257610100808354040283529160200191611f5d565b820191906000526020600020905b815481529060010190602001808311611f4057829003601f168201915b505050505090505b919050565b60125481565b60105481565b600e8054611f839061385e565b80601f0160208091040260200160405190810160405280929190818152602001828054611faf9061385e565b8015611ffc5780601f10611fd157610100808354040283529160200191611ffc565b820191906000526020600020905b815481529060010190602001808311611fdf57829003601f168201915b505050505081565b61200c6122c7565b8060138190555050565b6000806000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546014546120689190613dd1565b905080841061209157808461207d9190613dd1565b60115461208a9190613e05565b9150612096565b600091505b8192505050919050565b6060600a80546120af9061385e565b80601f01602080910402602001604051908101604052809291908181526020018280546120db9061385e565b80156121285780601f106120fd57610100808354040283529160200191612128565b820191906000526020600020905b81548152906001019060200180831161210b57829003601f168201915b5050505050905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6121ce6122c7565b8060108190555050565b6121e06122c7565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361224f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224690614288565b60405180910390fd5b612258816129c3565b50565b6000816122666122c2565b11158015612275575060015482105b80156122b3575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b6122cf612c5a565b73ffffffffffffffffffffffffffffffffffffffff166122ed61125e565b73ffffffffffffffffffffffffffffffffffffffff1614612343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233a906142f4565b60405180910390fd5b565b61235f828260405180602001604052806000815250612c62565b5050565b600061236e826128f7565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146123d5576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806123e184612d00565b915091506123f781876123f26122ba565b612d27565b6124435761240c866124076122ba565b612132565b612442576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036124a9576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124b68686866001612d6b565b80156124c157600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061258f8561256b888887612d71565b7c020000000000000000000000000000000000000000000000000000000017612d99565b600560008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036126155760006001850190506000600560008381526020019081526020016000205403612613576001548114612612578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461267d8686866001612dc4565b505050505050565b6126a08383836040518060200160405280600081525061192d565b505050565b60006126b0836128f7565b905060008190506000806126c386612d00565b91509150841561272c576126df81846126da6122ba565b612d27565b61272b576126f4836126ef6122ba565b612132565b61272a576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b61273a836000886001612d6b565b801561274557600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506127ed836127aa85600088612d71565b7c02000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000001717612d99565b600560008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036128735760006001870190506000600560008381526020019081526020016000205403612871576001548114612870578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128dd836000886001612dc4565b600260008154809291906001019190505550505050505050565b600080829050806129066122c2565b1161298c5760015481101561298b5760006005600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612989575b6000810361297f576005600083600190039350838152602001908152602001600020549050612955565b80925050506129be565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612a92848484610d1a565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612af457612abd84848484612dca565b612af3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606060008203612b41576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c55565b600082905060005b60008214612b73578080612b5c90614314565b915050600a82612b6c919061438b565b9150612b49565b60008167ffffffffffffffff811115612b8f57612b8e61348f565b5b6040519080825280601f01601f191660200182016040528015612bc15781602001600182028036833780820191505090505b5090505b60008514612c4e57600182612bda9190613dd1565b9150600a85612be991906143bc565b6030612bf591906138be565b60f81b818381518110612c0b57612c0a6143ed565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c47919061438b565b9450612bc5565b8093505050505b919050565b600033905090565b612c6c8383612f1a565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612cfb5760006001549050600083820390505b612cad6000868380600101945086612dca565b612ce3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612c9a578160015414612cf857600080fd5b50505b505050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612d888686846130d6565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612df06122ba565b8786866040518563ffffffff1660e01b8152600401612e129493929190614471565b6020604051808303816000875af1925050508015612e4e57506040513d601f19601f82011682018060405250810190612e4b91906144d2565b60015b612ec7573d8060008114612e7e576040519150601f19603f3d011682016040523d82523d6000602084013e612e83565b606091505b506000815103612ebf576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6000600154905060008203612f5b576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f686000848385612d6b565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612fdf83612fd06000866000612d71565b612fd9856130df565b17612d99565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461308057808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050613045565b50600082036130bb576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060018190555050506130d16000848385612dc4565b505050565b60009392505050565b60006001821460e11b9050919050565b60008115159050919050565b613104816130ef565b82525050565b600060208201905061311f60008301846130fb565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61316e81613139565b811461317957600080fd5b50565b60008135905061318b81613165565b92915050565b6000602082840312156131a7576131a661312f565b5b60006131b58482850161317c565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156131f85780820151818401526020810190506131dd565b60008484015250505050565b6000601f19601f8301169050919050565b6000613220826131be565b61322a81856131c9565b935061323a8185602086016131da565b61324381613204565b840191505092915050565b600060208201905081810360008301526132688184613215565b905092915050565b6000819050919050565b61328381613270565b811461328e57600080fd5b50565b6000813590506132a08161327a565b92915050565b6000602082840312156132bc576132bb61312f565b5b60006132ca84828501613291565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006132fe826132d3565b9050919050565b61330e816132f3565b82525050565b60006020820190506133296000830184613305565b92915050565b613338816132f3565b811461334357600080fd5b50565b6000813590506133558161332f565b92915050565b600080604083850312156133725761337161312f565b5b600061338085828601613346565b925050602061339185828601613291565b9150509250929050565b6133a481613270565b82525050565b60006020820190506133bf600083018461339b565b92915050565b600080604083850312156133dc576133db61312f565b5b60006133ea85828601613291565b92505060206133fb85828601613346565b9150509250929050565b60006020828403121561341b5761341a61312f565b5b600061342984828501613346565b91505092915050565b60008060006060848603121561344b5761344a61312f565b5b600061345986828701613346565b935050602061346a86828701613346565b925050604061347b86828701613291565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6134c782613204565b810181811067ffffffffffffffff821117156134e6576134e561348f565b5b80604052505050565b60006134f9613125565b905061350582826134be565b919050565b600067ffffffffffffffff8211156135255761352461348f565b5b61352e82613204565b9050602081019050919050565b82818337600083830152505050565b600061355d6135588461350a565b6134ef565b9050828152602081018484840111156135795761357861348a565b5b61358484828561353b565b509392505050565b600082601f8301126135a1576135a0613485565b5b81356135b184826020860161354a565b91505092915050565b6000602082840312156135d0576135cf61312f565b5b600082013567ffffffffffffffff8111156135ee576135ed613134565b5b6135fa8482850161358c565b91505092915050565b61360c816130ef565b811461361757600080fd5b50565b60008135905061362981613603565b92915050565b600080604083850312156136465761364561312f565b5b60006136548582860161361a565b925050602083013567ffffffffffffffff81111561367557613674613134565b5b6136818582860161358c565b9150509250929050565b600080604083850312156136a2576136a161312f565b5b60006136b085828601613346565b92505060206136c18582860161361a565b9150509250929050565b600067ffffffffffffffff8211156136e6576136e561348f565b5b6136ef82613204565b9050602081019050919050565b600061370f61370a846136cb565b6134ef565b90508281526020810184848401111561372b5761372a61348a565b5b61373684828561353b565b509392505050565b600082601f83011261375357613752613485565b5b81356137638482602086016136fc565b91505092915050565b600080600080608085870312156137865761378561312f565b5b600061379487828801613346565b94505060206137a587828801613346565b93505060406137b687828801613291565b925050606085013567ffffffffffffffff8111156137d7576137d6613134565b5b6137e38782880161373e565b91505092959194509250565b600080604083850312156138065761380561312f565b5b600061381485828601613346565b925050602061382585828601613346565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061387657607f821691505b6020821081036138895761388861382f565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006138c982613270565b91506138d483613270565b92508282019050808211156138ec576138eb61388f565b5b92915050565b7f4e6f206d6f726520746f6b656e7320696e2073746f636b210000000000000000600082015250565b60006139286018836131c9565b9150613933826138f2565b602082019050919050565b600060208201905081810360008301526139578161391b565b9050919050565b60006040820190506139736000830185613305565b6139806020830184613305565b9392505050565b60008151905061399681613603565b92915050565b6000602082840312156139b2576139b161312f565b5b60006139c084828501613987565b91505092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006139ff601f836131c9565b9150613a0a826139c9565b602082019050919050565b60006020820190508181036000830152613a2e816139f2565b9050919050565b600081905092915050565b50565b6000613a50600083613a35565b9150613a5b82613a40565b600082019050919050565b6000613a7182613a43565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b6000613ab16010836131c9565b9150613abc82613a7b565b602082019050919050565b60006020820190508181036000830152613ae081613aa4565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613b497fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613b0c565b613b538683613b0c565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613b90613b8b613b8684613270565b613b6b565b613270565b9050919050565b6000819050919050565b613baa83613b75565b613bbe613bb682613b97565b848454613b19565b825550505050565b600090565b613bd3613bc6565b613bde818484613ba1565b505050565b5b81811015613c0257613bf7600082613bcb565b600181019050613be4565b5050565b601f821115613c4757613c1881613ae7565b613c2184613afc565b81016020851015613c30578190505b613c44613c3c85613afc565b830182613be3565b50505b505050565b600082821c905092915050565b6000613c6a60001984600802613c4c565b1980831691505092915050565b6000613c838383613c59565b9150826002028217905092915050565b613c9c826131be565b67ffffffffffffffff811115613cb557613cb461348f565b5b613cbf825461385e565b613cca828285613c06565b600060209050601f831160018114613cfd5760008415613ceb578287015190505b613cf58582613c77565b865550613d5d565b601f198416613d0b86613ae7565b60005b82811015613d3357848901518255600182019150602085019450602081019050613d0e565b86831015613d505784890151613d4c601f891682613c59565b8355505b6001600288020188555050505b505050505050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b6000613d9b601e836131c9565b9150613da682613d65565b602082019050919050565b60006020820190508181036000830152613dca81613d8e565b9050919050565b6000613ddc82613270565b9150613de783613270565b9250828203905081811115613dff57613dfe61388f565b5b92915050565b6000613e1082613270565b9150613e1b83613270565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e5457613e5361388f565b5b828202905092915050565b7f456c6673206e6f74207265616479207965742100000000000000000000000000600082015250565b6000613e956013836131c9565b9150613ea082613e5f565b602082019050919050565b60006020820190508181036000830152613ec481613e88565b9050919050565b7f4e6f206d6f726520456c66732100000000000000000000000000000000000000600082015250565b6000613f01600d836131c9565b9150613f0c82613ecb565b602082019050919050565b60006020820190508181036000830152613f3081613ef4565b9050919050565b7f547269656420746f20746f74616c206d696e7420456c6673207065722077616c60008201527f6c6574206f766572206c696d6974000000000000000000000000000000000000602082015250565b6000613f93602e836131c9565b9150613f9e82613f37565b604082019050919050565b60006020820190508181036000830152613fc281613f86565b9050919050565b7f547269656420746f206d696e7420456c6673206f766572206c696d69742c207260008201527f6574727920776974682072656475636564207175616e74697479000000000000602082015250565b6000614025603a836131c9565b915061403082613fc9565b604082019050919050565b6000602082019050818103600083015261405481614018565b9050919050565b7f4d7573742073656e6420656e6f75676820657468000000000000000000000000600082015250565b60006140916014836131c9565b915061409c8261405b565b602082019050919050565b600060208201905081810360008301526140c081614084565b9050919050565b7f4e6f206d6f726520546f6b656e73210000000000000000000000000000000000600082015250565b60006140fd600f836131c9565b9150614108826140c7565b602082019050919050565b6000602082019050818103600083015261412c816140f0565b9050919050565b600081905092915050565b6000815461414b8161385e565b6141558186614133565b945060018216600081146141705760018114614185576141b8565b60ff19831686528115158202860193506141b8565b61418e85613ae7565b60005b838110156141b057815481890152600182019150602081019050614191565b838801955050505b50505092915050565b60006141cc826131be565b6141d68185614133565b93506141e68185602086016131da565b80840191505092915050565b60006141fe828561413e565b915061420a82846141c1565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006142726026836131c9565b915061427d82614216565b604082019050919050565b600060208201905081810360008301526142a181614265565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006142de6020836131c9565b91506142e9826142a8565b602082019050919050565b6000602082019050818103600083015261430d816142d1565b9050919050565b600061431f82613270565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036143515761435061388f565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061439682613270565b91506143a183613270565b9250826143b1576143b061435c565b5b828204905092915050565b60006143c782613270565b91506143d283613270565b9250826143e2576143e161435c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006144438261441c565b61444d8185614427565b935061445d8185602086016131da565b61446681613204565b840191505092915050565b60006080820190506144866000830187613305565b6144936020830186613305565b6144a0604083018561339b565b81810360608301526144b28184614438565b905095945050505050565b6000815190506144cc81613165565b92915050565b6000602082840312156144e8576144e761312f565b5b60006144f6848285016144bd565b9150509291505056fea26469706673582212206e52bb806055b7069bc3ecd1e7765aba7caccea0f098f65906eecef36adb499a64736f6c63430008100033
Deployed Bytecode Sourcemap
36479:5769:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36744:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16976:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17228:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20804:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20388:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36934:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15339:180;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37031:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36607:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41250:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39988:191;;;;;;;;;;;;;:::i;:::-;;41141:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41443:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36352:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36678:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36573:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36897:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17876:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15804:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3088:103;;;;;;;;;;;;;:::i;:::-;;2853:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40796:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40564:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17336:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40305:146;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38875:1105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21030:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40187:110;;;;;;;;;;;;;:::i;:::-;;36655:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40901:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41644:250;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37756:1111;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36823:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41902:341;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36863:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36786:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36714:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41026:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37424:324;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40459:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21272:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40687:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3201:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36744:39;;;;;;;;;;;;;:::o;16976:244::-;17061:4;17115:10;17100:25;;:11;:25;;;;:68;;;;17158:10;17143:25;;:11;:25;;;;17100:68;:111;;;;17201:10;17186:25;;:11;:25;;;;17100:111;17080:131;;16976:244;;;:::o;17228:100::-;17282:13;17315:5;17308:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17228:100;:::o;20804:218::-;20880:7;20905:16;20913:7;20905;:16::i;:::-;20900:64;;20930:34;;;;;;;;;;;;;;20900:64;20984:15;:24;21000:7;20984:24;;;;;;;;;;;:30;;;;;;;;;;;;20977:37;;20804:218;;;:::o;20388:408::-;20477:13;20493:16;20501:7;20493;:16::i;:::-;20477:32;;20549:5;20526:28;;:19;:17;:19::i;:::-;:28;;;20522:175;;20574:44;20591:5;20598:19;:17;:19::i;:::-;20574:16;:44::i;:::-;20569:128;;20646:35;;;;;;;;;;;;;;20569:128;20522:175;20742:2;20709:15;:24;20725:7;20709:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;20780:7;20776:2;20760:28;;20769:5;20760:28;;;;;;;;;;;;20466:330;20388:408;;:::o;36934:38::-;;;;:::o;15339:180::-;15400:7;15485:15;:13;:15::i;:::-;15470:12;;15454:13;;:28;:46;15447:53;;15339:180;:::o;37031:256::-;2812:13;:11;:13::i;:::-;37162:15:::1;;37150:8;37134:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:43;;37112:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;37250:29;37260:8;37270;37250:9;:29::i;:::-;37031:256:::0;;:::o;36607:45::-;;;;;;;;;;;;;;;;;:::o;41250:185::-;33588:1;32799:42;33542:43;;;:47;33538:225;;;32799:42;33611:40;;;33660:4;33667:10;33611:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33606:146;;33725:10;33706:30;;;;;;;;;;;:::i;:::-;;;;;;;;33606:146;33538:225;41390:37:::1;41409:4;41415:2;41419:7;41390:18;:37::i;:::-;41250:185:::0;;;:::o;39988:191::-;2812:13;:11;:13::i;:::-;3762:1:::1;3982:7;;:19:::0;3974:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3762:1;4115:7;:18;;;;40057:12:::2;40075:10;:15;;40098:21;40075:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40056:68;;;40143:7;40135:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;40045:134;3718:1:::1;4160:7;:22;;;;39988:191::o:0;41141:101::-;2812:13;:11;:13::i;:::-;41230:4:::1;41213:14;:21;;;;41141:101:::0;:::o;41443:193::-;33588:1;32799:42;33542:43;;;:47;33538:225;;;32799:42;33611:40;;;33660:4;33667:10;33611:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33606:146;;33725:10;33706:30;;;;;;;;;;;:::i;:::-;;;;;;;;33606:146;33538:225;41587:41:::1;41610:4;41616:2;41620:7;41587:22;:41::i;:::-;41443:193:::0;;;:::o;36352:94::-;36418:20;36424:7;36433:4;36418:5;:20::i;:::-;36352:94;:::o;36678:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36573:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36897:34::-;;;;:::o;17876:152::-;17948:7;17991:27;18010:7;17991:18;:27::i;:::-;17968:52;;17876:152;;;:::o;15804:233::-;15876:7;15917:1;15900:19;;:5;:19;;;15896:60;;15928:28;;;;;;;;;;;;;;15896:60;13612:13;15974:18;:25;15993:5;15974:25;;;;;;;;;;;;;;;;:55;15967:62;;15804:233;;;:::o;3088:103::-;2812:13;:11;:13::i;:::-;3153:30:::1;3180:1;3153:18;:30::i;:::-;3088:103::o:0;2853:87::-;2899:7;2926:6;;;;;;;;;;;2919:13;;2853:87;:::o;40796:97::-;2812:13;:11;:13::i;:::-;40876:9:::1;40863:10;:22;;;;40796:97:::0;:::o;40564:115::-;2812:13;:11;:13::i;:::-;40659:12:::1;40644;:27;;;;;;:::i;:::-;;40564:115:::0;:::o;17336:104::-;17392:13;17425:7;17418:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17336:104;:::o;40305:146::-;2812:13;:11;:13::i;:::-;40404:8:::1;40393;:19;;;;;;:::i;:::-;;40434:9;40423:8;;:20;;;;;;;;;;;;;;;;;;40305:146:::0;;:::o;38875:1105::-;37351:10;37338:23;;:9;:23;;;37330:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;3762:1:::1;3982:7;;:19:::0;3974:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3762:1;4115:7;:18;;;;39000:10:::2;39021:9:::0;39058:13:::2;:25;39072:10;39058:25;;;;;;;;;;;;;;;;39033:22;;:50;;;;:::i;:::-;39021:62;;39110:4;39098:8;:16;39094:285;;39166:4;39155:8;:15;;;;:::i;:::-;39140:10;;39139:32;;;;:::i;:::-;39131:40;;39242:4;39214:13;:25;39228:10;39214:25;;;;;;;;;;;;;;;;:32;;;;:::i;:::-;39186:13;:25;39200:10;39186:25;;;;;;;;;;;;;;;:60;;;;39094:285;;;39287:1;39279:9;;39359:8;39331:13;:25;39345:10;39331:25;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;39303:13;:25;39317:10;39303:25;;;;;;;;;;;;;;;:64;;;;39094:285;39399:19;;;;;;;;;;;39391:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;39489:15;;39477:8;39461:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:43;;39453:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;39579:17;;39567:8;39543:21;39553:10;39543:9;:21::i;:::-;:32;;;;:::i;:::-;:53;;39535:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;39680:14;;39668:8;:26;;39660:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;39789:5;39776:9;:18;;39768:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;39832:31;39842:10;39854:8;39832:9;:31::i;:::-;39892:5;39880:9;:17;39876:97;;;39922:10;39914:28;;:47;39955:5;39943:9;:17;;;;:::i;:::-;39914:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;39876:97;38989:991;;3718:1:::1;4160:7;:22;;;;38875:1105:::0;:::o;21030:234::-;21177:8;21125:18;:39;21144:19;:17;:19::i;:::-;21125:39;;;;;;;;;;;;;;;:49;21165:8;21125:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;21237:8;21201:55;;21216:19;:17;:19::i;:::-;21201:55;;;21247:8;21201:55;;;;;;:::i;:::-;;;;;;;;21030:234;;:::o;40187:110::-;2812:13;:11;:13::i;:::-;40270:19:::1;;;;;;;;;;;40269:20;40247:19;;:42;;;;;;;;;;;;;;;;;;40187:110::o:0;36655:20::-;;;;;;;;;;;;;:::o;40901:117::-;2812:13;:11;:13::i;:::-;41006:4:::1;40981:22;:29;;;;40901:117:::0;:::o;41644:250::-;33588:1;32799:42;33542:43;;;:47;33538:225;;;32799:42;33611:40;;;33660:4;33667:10;33611:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33606:146;;33725:10;33706:30;;;;;;;;;;;:::i;:::-;;;;;;;;33606:146;33538:225;41839:47:::1;41862:4;41868:2;41872:7;41881:4;41839:22;:47::i;:::-;41644:250:::0;;;;:::o;37756:1111::-;37351:10;37338:23;;:9;:23;;;37330:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;3762:1:::1;3982:7;;:19:::0;3974:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3762:1;4115:7;:18;;;;37885:10:::2;37906:9:::0;37943:13:::2;:25;37957:10;37943:25;;;;;;;;;;;;;;;;37918:22;;:50;;;;:::i;:::-;37906:62;;37995:4;37983:8;:16;37979:285;;38051:4;38040:8;:15;;;;:::i;:::-;38025:10;;38024:32;;;;:::i;:::-;38016:40;;38127:4;38099:13;:25;38113:10;38099:25;;;;;;;;;;;;;;;;:32;;;;:::i;:::-;38071:13;:25;38085:10;38071:25;;;;;;;;;;;;;;;:60;;;;37979:285;;;38172:1;38164:9;;38244:8;38216:13;:25;38230:10;38216:25;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;38188:13;:25;38202:10;38188:25;;;;;;;;;;;;;;;:64;;;;37979:285;38284:19;;;;;;;;;;;38276:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;38374:15;;38362:8;38346:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:43;;38338:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;38466:17;;38454:8;38430:21;38440:10;38430:9;:21::i;:::-;:32;;;;:::i;:::-;:53;;38422:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;38567:14;;38555:8;:26;;38547:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;38676:5;38663:9;:18;;38655:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;38719:31;38729:10;38741:8;38719:9;:31::i;:::-;38779:5;38767:9;:17;38763:97;;;38809:10;38801:28;;:47;38842:5;38830:9;:17;;;;:::i;:::-;38801:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;38763:97;37874:993;;3718:1:::1;4160:7;:22;;;;37756:1111:::0;:::o;36823:37::-;;;;:::o;41902:341::-;42024:13;42059:8;;;;;;;;;;;42055:181;;;42132:8;42142:26;42159:8;42142:16;:26::i;:::-;42115:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42084:86;;;;42055:181;42210:14;42203:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41902:341;;;;:::o;36863:31::-;;;;:::o;36786:34::-;;;;:::o;36714:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;41026:107::-;2812:13;:11;:13::i;:::-;41121:4:::1;41101:17;:24;;;;41026:107:::0;:::o;37424:324::-;37477:4;37493:10;37514:9;37551:13;:25;37565:10;37551:25;;;;;;;;;;;;;;;;37526:22;;:50;;;;:::i;:::-;37514:62;;37603:4;37591:8;:16;37587:131;;37659:4;37648:8;:15;;;;:::i;:::-;37633:10;;37632:32;;;;:::i;:::-;37624:40;;37587:131;;;37705:1;37697:9;;37587:131;37735:5;37728:12;;;;37424:324;;;:::o;40459:97::-;40503:13;40536:12;40529:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40459:97;:::o;21272:164::-;21369:4;21393:18;:25;21412:5;21393:25;;;;;;;;;;;;;;;:35;21419:8;21393:35;;;;;;;;;;;;;;;;;;;;;;;;;21386:42;;21272:164;;;;:::o;40687:101::-;2812:13;:11;:13::i;:::-;40776:4:::1;40758:15;:22;;;;40687:101:::0;:::o;3201:201::-;2812:13;:11;:13::i;:::-;3310:1:::1;3290:22;;:8;:22;;::::0;3282:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3366:28;3385:8;3366:18;:28::i;:::-;3201:201:::0;:::o;21444:282::-;21509:4;21565:7;21546:15;:13;:15::i;:::-;:26;;:66;;;;;21599:13;;21589:7;:23;21546:66;:153;;;;;21698:1;13986:8;21650:17;:26;21668:7;21650:26;;;;;;;;;;;;:44;:49;21546:153;21526:173;;21444:282;;;:::o;31824:105::-;31884:7;31911:10;31904:17;;31824:105;:::o;15128:92::-;15184:7;15128:92;:::o;2948:132::-;3023:12;:10;:12::i;:::-;3012:23;;:7;:5;:7::i;:::-;:23;;;3004:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2948:132::o;28977:112::-;29054:27;29064:2;29068:8;29054:27;;;;;;;;;;;;:9;:27::i;:::-;28977:112;;:::o;22539:1651::-;22681:27;22711;22730:7;22711:18;:27::i;:::-;22681:57;;22796:4;22755:45;;22771:19;22755:45;;;22751:86;;22809:28;;;;;;;;;;;;;;22751:86;22851:27;22880:23;22907:35;22934:7;22907:26;:35::i;:::-;22850:92;;;;22960:68;22985:15;23002:4;23008:19;:17;:19::i;:::-;22960:24;:68::i;:::-;22955:180;;23048:43;23065:4;23071:19;:17;:19::i;:::-;23048:16;:43::i;:::-;23043:92;;23100:35;;;;;;;;;;;;;;23043:92;22955:180;23166:1;23152:16;;:2;:16;;;23148:52;;23177:23;;;;;;;;;;;;;;23148:52;23213:43;23235:4;23241:2;23245:7;23254:1;23213:21;:43::i;:::-;23296:15;23293:85;;;23361:1;23340:19;23333:30;23293:85;23430:18;:24;23449:4;23430:24;;;;;;;;;;;;;;;;23428:26;;;;;;;;;;;;23472:18;:22;23491:2;23472:22;;;;;;;;;;;;;;;;23470:24;;;;;;;;;;;23541:146;23578:2;23627:45;23642:4;23648:2;23652:19;23627:14;:45::i;:::-;14120:8;23599:73;23541:18;:146::i;:::-;23512:17;:26;23530:7;23512:26;;;;;;;;;;;:175;;;;23759:1;14120:8;23708:19;:47;:52;23704:370;;23781:19;23813:1;23803:7;:11;23781:33;;23873:1;23839:17;:30;23857:11;23839:30;;;;;;;;;;;;:35;23835:224;;23920:13;;23905:11;:28;23901:139;;23997:19;23964:17;:30;23982:11;23964:30;;;;;;;;;;;:52;;;;23901:139;23835:224;23762:312;23704:370;24121:7;24117:2;24102:27;;24111:4;24102:27;;;;;;;;;;;;24140:42;24161:4;24167:2;24171:7;24180:1;24140:20;:42::i;:::-;22670:1520;;;22539:1651;;;:::o;24198:193::-;24344:39;24361:4;24367:2;24371:7;24344:39;;;;;;;;;;;;:16;:39::i;:::-;24198:193;;;:::o;29194:1679::-;29274:27;29304;29323:7;29304:18;:27::i;:::-;29274:57;;29344:12;29375:19;29344:52;;29410:27;29439:23;29466:35;29493:7;29466:26;:35::i;:::-;29409:92;;;;29518:13;29514:244;;;29567:68;29592:15;29609:4;29615:19;:17;:19::i;:::-;29567:24;:68::i;:::-;29562:184;;29659:43;29676:4;29682:19;:17;:19::i;:::-;29659:16;:43::i;:::-;29654:92;;29711:35;;;;;;;;;;;;;;29654:92;29562:184;29514:244;29770:51;29792:4;29806:1;29810:7;29819:1;29770:21;:51::i;:::-;29861:15;29858:101;;;29942:1;29921:19;29914:30;29858:101;30068:1;13743:3;30038:1;:26;;30037:32;30009:18;:24;30028:4;30009:24;;;;;;;;;;;;;;;;:60;;;;;;;;;;;30115:176;30152:4;30223:53;30238:4;30252:1;30256:19;30223:14;:53::i;:::-;14120:8;13986;30176:43;30175:101;30115:18;:176::i;:::-;30086:17;:26;30104:7;30086:26;;;;;;;;;;;:205;;;;30363:1;14120:8;30312:19;:47;:52;30308:370;;30385:19;30417:1;30407:7;:11;30385:33;;30477:1;30443:17;:30;30461:11;30443:30;;;;;;;;;;;;:35;30439:224;;30524:13;;30509:11;:28;30505:139;;30601:19;30568:17;:30;30586:11;30568:30;;;;;;;;;;;:52;;;;30505:139;30439:224;30366:312;30308:370;30733:7;30729:1;30706:35;;30715:4;30706:35;;;;;;;;;;;;30752:50;30773:4;30787:1;30791:7;30800:1;30752:20;:50::i;:::-;30840:12;;:14;;;;;;;;;;;;;29263:1610;;;;29194:1679;;:::o;18583:633::-;18650:7;18670:12;18685:7;18670:22;;18753:4;18734:15;:13;:15::i;:::-;:23;18730:419;;18787:13;;18780:4;:20;18776:373;;;18825:14;18842:17;:23;18860:4;18842:23;;;;;;;;;;;;18825:40;;18922:1;13986:8;18894:6;:24;:29;18890:240;;18954:113;18971:1;18961:6;:11;18954:113;;19014:17;:25;19032:6;;;;;;;19014:25;;;;;;;;;;;;19005:34;;18954:113;;;19100:6;19093:13;;;;;;18890:240;18802:347;18776:373;18730:419;19177:31;;;;;;;;;;;;;;18583:633;;;;:::o;3410:191::-;3484:16;3503:6;;;;;;;;;;;3484:25;;3529:8;3520:6;;:17;;;;;;;;;;;;;;;;;;3584:8;3553:40;;3574:8;3553:40;;;;;;;;;;;;3473:128;3410:191;:::o;24399:407::-;24574:31;24587:4;24593:2;24597:7;24574:12;:31::i;:::-;24638:1;24620:2;:14;;;:19;24616:183;;24659:56;24690:4;24696:2;24700:7;24709:5;24659:30;:56::i;:::-;24654:145;;24743:40;;;;;;;;;;;;;;24654:145;24616:183;24399:407;;;;:::o;4364:534::-;4420:13;4461:1;4452:5;:10;4448:53;;4479:10;;;;;;;;;;;;;;;;;;;;;4448:53;4511:12;4526:5;4511:20;;4542:14;4567:78;4582:1;4574:4;:9;4567:78;;4600:8;;;;;:::i;:::-;;;;4631:2;4623:10;;;;;:::i;:::-;;;4567:78;;;4655:19;4687:6;4677:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4655:39;;4705:154;4721:1;4712:5;:10;4705:154;;4749:1;4739:11;;;;;:::i;:::-;;;4816:2;4808:5;:10;;;;:::i;:::-;4795:2;:24;;;;:::i;:::-;4782:39;;4765:6;4772;4765:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;4845:2;4836:11;;;;;:::i;:::-;;;4705:154;;;4883:6;4869:21;;;;;4364:534;;;;:::o;2301:98::-;2354:7;2381:10;2374:17;;2301:98;:::o;28280:689::-;28411:19;28417:2;28421:8;28411:5;:19::i;:::-;28490:1;28472:2;:14;;;:19;28468:483;;28512:11;28526:13;;28512:27;;28558:13;28580:8;28574:3;:14;28558:30;;28607:233;28638:62;28677:1;28681:2;28685:7;;;;;;28694:5;28638:30;:62::i;:::-;28633:167;;28736:40;;;;;;;;;;;;;;28633:167;28835:3;28827:5;:11;28607:233;;28922:3;28905:13;;:20;28901:34;;28927:8;;;28901:34;28493:458;;28468:483;28280:689;;;:::o;22139:392::-;22241:27;22270:23;22311:38;22352:15;:24;22368:7;22352:24;;;;;;;;;;;22311:65;;22436:18;22413:41;;22493:19;22487:26;22468:45;;22398:126;22139:392;;;:::o;21734:397::-;21883:11;21953:16;21946:5;21942:28;21933:37;;22014:16;22003:9;21999:32;21986:45;;22096:15;22085:9;22082:30;22074:5;22063:9;22060:20;22057:56;22047:66;;21734:397;;;;;:::o;24814:159::-;;;;;:::o;31505:311::-;31640:7;31660:16;14183:3;31686:19;:41;;31660:68;;14183:3;31754:31;31765:4;31771:2;31775:9;31754:10;:31::i;:::-;31746:40;;:62;;31739:69;;;31505:311;;;;;:::o;19598:450::-;19678:14;19846:16;19839:5;19835:28;19826:37;;20023:5;20009:11;19984:23;19980:41;19977:52;19970:5;19967:63;19957:73;;19598:450;;;;:::o;24981:158::-;;;;;:::o;25147:716::-;25310:4;25356:2;25331:45;;;25377:19;:17;:19::i;:::-;25398:4;25404:7;25413:5;25331:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;25327:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25631:1;25614:6;:13;:18;25610:235;;25660:40;;;;;;;;;;;;;;25610:235;25803:6;25797:13;25788:6;25784:2;25780:15;25773:38;25327:529;25500:54;;;25490:64;;;:6;:64;;;;25483:71;;;25147:716;;;;;;:::o;25871:1442::-;25944:20;25967:13;;25944:36;;26007:1;25995:8;:13;25991:44;;26017:18;;;;;;;;;;;;;;25991:44;26048:61;26078:1;26082:2;26086:12;26100:8;26048:21;:61::i;:::-;26218:1;13683:2;26188:1;:26;;26187:32;26175:8;:45;26149:18;:22;26168:2;26149:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;26271:139;26308:2;26362:33;26385:1;26389:2;26393:1;26362:14;:33::i;:::-;26329:30;26350:8;26329:20;:30::i;:::-;:66;26271:18;:139::i;:::-;26237:17;:31;26255:12;26237:31;;;;;;;;;;;:173;;;;26427:16;26458:11;26487:8;26472:12;:23;26458:37;;26562:16;26558:2;26554:25;26542:37;;26782:12;26750:8;26725:1;26676:25;26651:1;26626;26599:215;26894:1;26880:12;26876:20;26834:279;26935:3;26926:7;26923:16;26834:279;;27086:7;27076:8;27073:1;27046:25;27043:1;27040;27035:59;26988:1;26979:7;26975:15;26964:26;;26834:279;;;26838:77;27158:1;27146:8;:13;27142:45;;27168:19;;;;;;;;;;;;;;27142:45;27220:3;27204:13;:19;;;;26122:1113;;27245:60;27274:1;27278:2;27282:12;27296:8;27245:20;:60::i;:::-;25933:1380;25871:1442;;:::o;31350:147::-;31487:6;31350:147;;;;;:::o;20056:324::-;20126:14;20359:1;20349:8;20346:15;20320:24;20316:46;20306:56;;20056:324;;;:::o;7:90:1:-;41:7;84:5;77:13;70:21;59:32;;7:90;;;:::o;103:109::-;184:21;199:5;184:21;:::i;:::-;179:3;172:34;103:109;;:::o;218:210::-;305:4;343:2;332:9;328:18;320:26;;356:65;418:1;407:9;403:17;394:6;356:65;:::i;:::-;218:210;;;;:::o;434:75::-;467:6;500:2;494:9;484:19;;434:75;:::o;515:117::-;624:1;621;614:12;638:117;747:1;744;737:12;761:149;797:7;837:66;830:5;826:78;815:89;;761:149;;;:::o;916:120::-;988:23;1005:5;988:23;:::i;:::-;981:5;978:34;968:62;;1026:1;1023;1016:12;968:62;916:120;:::o;1042:137::-;1087:5;1125:6;1112:20;1103:29;;1141:32;1167:5;1141:32;:::i;:::-;1042:137;;;;:::o;1185:327::-;1243:6;1292:2;1280:9;1271:7;1267:23;1263:32;1260:119;;;1298:79;;:::i;:::-;1260:119;1418:1;1443:52;1487:7;1478:6;1467:9;1463:22;1443:52;:::i;:::-;1433:62;;1389:116;1185:327;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:474::-;5310:6;5318;5367:2;5355:9;5346:7;5342:23;5338:32;5335:119;;;5373:79;;:::i;:::-;5335:119;5493:1;5518:53;5563:7;5554:6;5543:9;5539:22;5518:53;:::i;:::-;5508:63;;5464:117;5620:2;5646:53;5691:7;5682:6;5671:9;5667:22;5646:53;:::i;:::-;5636:63;;5591:118;5242:474;;;;;:::o;5722:329::-;5781:6;5830:2;5818:9;5809:7;5805:23;5801:32;5798:119;;;5836:79;;:::i;:::-;5798:119;5956:1;5981:53;6026:7;6017:6;6006:9;6002:22;5981:53;:::i;:::-;5971:63;;5927:117;5722:329;;;;:::o;6057:619::-;6134:6;6142;6150;6199:2;6187:9;6178:7;6174:23;6170:32;6167:119;;;6205:79;;:::i;:::-;6167:119;6325:1;6350:53;6395:7;6386:6;6375:9;6371:22;6350:53;:::i;:::-;6340:63;;6296:117;6452:2;6478:53;6523:7;6514:6;6503:9;6499:22;6478:53;:::i;:::-;6468:63;;6423:118;6580:2;6606:53;6651:7;6642:6;6631:9;6627:22;6606:53;:::i;:::-;6596:63;;6551:118;6057:619;;;;;:::o;6682:117::-;6791:1;6788;6781:12;6805:117;6914:1;6911;6904:12;6928:180;6976:77;6973:1;6966:88;7073:4;7070:1;7063:15;7097:4;7094:1;7087:15;7114:281;7197:27;7219:4;7197:27;:::i;:::-;7189:6;7185:40;7327:6;7315:10;7312:22;7291:18;7279:10;7276:34;7273:62;7270:88;;;7338:18;;:::i;:::-;7270:88;7378:10;7374:2;7367:22;7157:238;7114:281;;:::o;7401:129::-;7435:6;7462:20;;:::i;:::-;7452:30;;7491:33;7519:4;7511:6;7491:33;:::i;:::-;7401:129;;;:::o;7536:308::-;7598:4;7688:18;7680:6;7677:30;7674:56;;;7710:18;;:::i;:::-;7674:56;7748:29;7770:6;7748:29;:::i;:::-;7740:37;;7832:4;7826;7822:15;7814:23;;7536:308;;;:::o;7850:146::-;7947:6;7942:3;7937;7924:30;7988:1;7979:6;7974:3;7970:16;7963:27;7850:146;;;:::o;8002:425::-;8080:5;8105:66;8121:49;8163:6;8121:49;:::i;:::-;8105:66;:::i;:::-;8096:75;;8194:6;8187:5;8180:21;8232:4;8225:5;8221:16;8270:3;8261:6;8256:3;8252:16;8249:25;8246:112;;;8277:79;;:::i;:::-;8246:112;8367:54;8414:6;8409:3;8404;8367:54;:::i;:::-;8086:341;8002:425;;;;;:::o;8447:340::-;8503:5;8552:3;8545:4;8537:6;8533:17;8529:27;8519:122;;8560:79;;:::i;:::-;8519:122;8677:6;8664:20;8702:79;8777:3;8769:6;8762:4;8754:6;8750:17;8702:79;:::i;:::-;8693:88;;8509:278;8447:340;;;;:::o;8793:509::-;8862:6;8911:2;8899:9;8890:7;8886:23;8882:32;8879:119;;;8917:79;;:::i;:::-;8879:119;9065:1;9054:9;9050:17;9037:31;9095:18;9087:6;9084:30;9081:117;;;9117:79;;:::i;:::-;9081:117;9222:63;9277:7;9268:6;9257:9;9253:22;9222:63;:::i;:::-;9212:73;;9008:287;8793:509;;;;:::o;9308:116::-;9378:21;9393:5;9378:21;:::i;:::-;9371:5;9368:32;9358:60;;9414:1;9411;9404:12;9358:60;9308:116;:::o;9430:133::-;9473:5;9511:6;9498:20;9489:29;;9527:30;9551:5;9527:30;:::i;:::-;9430:133;;;;:::o;9569:648::-;9644:6;9652;9701:2;9689:9;9680:7;9676:23;9672:32;9669:119;;;9707:79;;:::i;:::-;9669:119;9827:1;9852:50;9894:7;9885:6;9874:9;9870:22;9852:50;:::i;:::-;9842:60;;9798:114;9979:2;9968:9;9964:18;9951:32;10010:18;10002:6;9999:30;9996:117;;;10032:79;;:::i;:::-;9996:117;10137:63;10192:7;10183:6;10172:9;10168:22;10137:63;:::i;:::-;10127:73;;9922:288;9569:648;;;;;:::o;10223:468::-;10288:6;10296;10345:2;10333:9;10324:7;10320:23;10316:32;10313:119;;;10351:79;;:::i;:::-;10313:119;10471:1;10496:53;10541:7;10532:6;10521:9;10517:22;10496:53;:::i;:::-;10486:63;;10442:117;10598:2;10624:50;10666:7;10657:6;10646:9;10642:22;10624:50;:::i;:::-;10614:60;;10569:115;10223:468;;;;;:::o;10697:307::-;10758:4;10848:18;10840:6;10837:30;10834:56;;;10870:18;;:::i;:::-;10834:56;10908:29;10930:6;10908:29;:::i;:::-;10900:37;;10992:4;10986;10982:15;10974:23;;10697:307;;;:::o;11010:423::-;11087:5;11112:65;11128:48;11169:6;11128:48;:::i;:::-;11112:65;:::i;:::-;11103:74;;11200:6;11193:5;11186:21;11238:4;11231:5;11227:16;11276:3;11267:6;11262:3;11258:16;11255:25;11252:112;;;11283:79;;:::i;:::-;11252:112;11373:54;11420:6;11415:3;11410;11373:54;:::i;:::-;11093:340;11010:423;;;;;:::o;11452:338::-;11507:5;11556:3;11549:4;11541:6;11537:17;11533:27;11523:122;;11564:79;;:::i;:::-;11523:122;11681:6;11668:20;11706:78;11780:3;11772:6;11765:4;11757:6;11753:17;11706:78;:::i;:::-;11697:87;;11513:277;11452:338;;;;:::o;11796:943::-;11891:6;11899;11907;11915;11964:3;11952:9;11943:7;11939:23;11935:33;11932:120;;;11971:79;;:::i;:::-;11932:120;12091:1;12116:53;12161:7;12152:6;12141:9;12137:22;12116:53;:::i;:::-;12106:63;;12062:117;12218:2;12244:53;12289:7;12280:6;12269:9;12265:22;12244:53;:::i;:::-;12234:63;;12189:118;12346:2;12372:53;12417:7;12408:6;12397:9;12393:22;12372:53;:::i;:::-;12362:63;;12317:118;12502:2;12491:9;12487:18;12474:32;12533:18;12525:6;12522:30;12519:117;;;12555:79;;:::i;:::-;12519:117;12660:62;12714:7;12705:6;12694:9;12690:22;12660:62;:::i;:::-;12650:72;;12445:287;11796:943;;;;;;;:::o;12745:474::-;12813:6;12821;12870:2;12858:9;12849:7;12845:23;12841:32;12838:119;;;12876:79;;:::i;:::-;12838:119;12996:1;13021:53;13066:7;13057:6;13046:9;13042:22;13021:53;:::i;:::-;13011:63;;12967:117;13123:2;13149:53;13194:7;13185:6;13174:9;13170:22;13149:53;:::i;:::-;13139:63;;13094:118;12745:474;;;;;:::o;13225:180::-;13273:77;13270:1;13263:88;13370:4;13367:1;13360:15;13394:4;13391:1;13384:15;13411:320;13455:6;13492:1;13486:4;13482:12;13472:22;;13539:1;13533:4;13529:12;13560:18;13550:81;;13616:4;13608:6;13604:17;13594:27;;13550:81;13678:2;13670:6;13667:14;13647:18;13644:38;13641:84;;13697:18;;:::i;:::-;13641:84;13462:269;13411:320;;;:::o;13737:180::-;13785:77;13782:1;13775:88;13882:4;13879:1;13872:15;13906:4;13903:1;13896:15;13923:191;13963:3;13982:20;14000:1;13982:20;:::i;:::-;13977:25;;14016:20;14034:1;14016:20;:::i;:::-;14011:25;;14059:1;14056;14052:9;14045:16;;14080:3;14077:1;14074:10;14071:36;;;14087:18;;:::i;:::-;14071:36;13923:191;;;;:::o;14120:174::-;14260:26;14256:1;14248:6;14244:14;14237:50;14120:174;:::o;14300:366::-;14442:3;14463:67;14527:2;14522:3;14463:67;:::i;:::-;14456:74;;14539:93;14628:3;14539:93;:::i;:::-;14657:2;14652:3;14648:12;14641:19;;14300:366;;;:::o;14672:419::-;14838:4;14876:2;14865:9;14861:18;14853:26;;14925:9;14919:4;14915:20;14911:1;14900:9;14896:17;14889:47;14953:131;15079:4;14953:131;:::i;:::-;14945:139;;14672:419;;;:::o;15097:332::-;15218:4;15256:2;15245:9;15241:18;15233:26;;15269:71;15337:1;15326:9;15322:17;15313:6;15269:71;:::i;:::-;15350:72;15418:2;15407:9;15403:18;15394:6;15350:72;:::i;:::-;15097:332;;;;;:::o;15435:137::-;15489:5;15520:6;15514:13;15505:22;;15536:30;15560:5;15536:30;:::i;:::-;15435:137;;;;:::o;15578:345::-;15645:6;15694:2;15682:9;15673:7;15669:23;15665:32;15662:119;;;15700:79;;:::i;:::-;15662:119;15820:1;15845:61;15898:7;15889:6;15878:9;15874:22;15845:61;:::i;:::-;15835:71;;15791:125;15578:345;;;;:::o;15929:181::-;16069:33;16065:1;16057:6;16053:14;16046:57;15929:181;:::o;16116:366::-;16258:3;16279:67;16343:2;16338:3;16279:67;:::i;:::-;16272:74;;16355:93;16444:3;16355:93;:::i;:::-;16473:2;16468:3;16464:12;16457:19;;16116:366;;;:::o;16488:419::-;16654:4;16692:2;16681:9;16677:18;16669:26;;16741:9;16735:4;16731:20;16727:1;16716:9;16712:17;16705:47;16769:131;16895:4;16769:131;:::i;:::-;16761:139;;16488:419;;;:::o;16913:147::-;17014:11;17051:3;17036:18;;16913:147;;;;:::o;17066:114::-;;:::o;17186:398::-;17345:3;17366:83;17447:1;17442:3;17366:83;:::i;:::-;17359:90;;17458:93;17547:3;17458:93;:::i;:::-;17576:1;17571:3;17567:11;17560:18;;17186:398;;;:::o;17590:379::-;17774:3;17796:147;17939:3;17796:147;:::i;:::-;17789:154;;17960:3;17953:10;;17590:379;;;:::o;17975:166::-;18115:18;18111:1;18103:6;18099:14;18092:42;17975:166;:::o;18147:366::-;18289:3;18310:67;18374:2;18369:3;18310:67;:::i;:::-;18303:74;;18386:93;18475:3;18386:93;:::i;:::-;18504:2;18499:3;18495:12;18488:19;;18147:366;;;:::o;18519:419::-;18685:4;18723:2;18712:9;18708:18;18700:26;;18772:9;18766:4;18762:20;18758:1;18747:9;18743:17;18736:47;18800:131;18926:4;18800:131;:::i;:::-;18792:139;;18519:419;;;:::o;18944:141::-;18993:4;19016:3;19008:11;;19039:3;19036:1;19029:14;19073:4;19070:1;19060:18;19052:26;;18944:141;;;:::o;19091:93::-;19128:6;19175:2;19170;19163:5;19159:14;19155:23;19145:33;;19091:93;;;:::o;19190:107::-;19234:8;19284:5;19278:4;19274:16;19253:37;;19190:107;;;;:::o;19303:393::-;19372:6;19422:1;19410:10;19406:18;19445:97;19475:66;19464:9;19445:97;:::i;:::-;19563:39;19593:8;19582:9;19563:39;:::i;:::-;19551:51;;19635:4;19631:9;19624:5;19620:21;19611:30;;19684:4;19674:8;19670:19;19663:5;19660:30;19650:40;;19379:317;;19303:393;;;;;:::o;19702:60::-;19730:3;19751:5;19744:12;;19702:60;;;:::o;19768:142::-;19818:9;19851:53;19869:34;19878:24;19896:5;19878:24;:::i;:::-;19869:34;:::i;:::-;19851:53;:::i;:::-;19838:66;;19768:142;;;:::o;19916:75::-;19959:3;19980:5;19973:12;;19916:75;;;:::o;19997:269::-;20107:39;20138:7;20107:39;:::i;:::-;20168:91;20217:41;20241:16;20217:41;:::i;:::-;20209:6;20202:4;20196:11;20168:91;:::i;:::-;20162:4;20155:105;20073:193;19997:269;;;:::o;20272:73::-;20317:3;20272:73;:::o;20351:189::-;20428:32;;:::i;:::-;20469:65;20527:6;20519;20513:4;20469:65;:::i;:::-;20404:136;20351:189;;:::o;20546:186::-;20606:120;20623:3;20616:5;20613:14;20606:120;;;20677:39;20714:1;20707:5;20677:39;:::i;:::-;20650:1;20643:5;20639:13;20630:22;;20606:120;;;20546:186;;:::o;20738:543::-;20839:2;20834:3;20831:11;20828:446;;;20873:38;20905:5;20873:38;:::i;:::-;20957:29;20975:10;20957:29;:::i;:::-;20947:8;20943:44;21140:2;21128:10;21125:18;21122:49;;;21161:8;21146:23;;21122:49;21184:80;21240:22;21258:3;21240:22;:::i;:::-;21230:8;21226:37;21213:11;21184:80;:::i;:::-;20843:431;;20828:446;20738:543;;;:::o;21287:117::-;21341:8;21391:5;21385:4;21381:16;21360:37;;21287:117;;;;:::o;21410:169::-;21454:6;21487:51;21535:1;21531:6;21523:5;21520:1;21516:13;21487:51;:::i;:::-;21483:56;21568:4;21562;21558:15;21548:25;;21461:118;21410:169;;;;:::o;21584:295::-;21660:4;21806:29;21831:3;21825:4;21806:29;:::i;:::-;21798:37;;21868:3;21865:1;21861:11;21855:4;21852:21;21844:29;;21584:295;;;;:::o;21884:1395::-;22001:37;22034:3;22001:37;:::i;:::-;22103:18;22095:6;22092:30;22089:56;;;22125:18;;:::i;:::-;22089:56;22169:38;22201:4;22195:11;22169:38;:::i;:::-;22254:67;22314:6;22306;22300:4;22254:67;:::i;:::-;22348:1;22372:4;22359:17;;22404:2;22396:6;22393:14;22421:1;22416:618;;;;23078:1;23095:6;23092:77;;;23144:9;23139:3;23135:19;23129:26;23120:35;;23092:77;23195:67;23255:6;23248:5;23195:67;:::i;:::-;23189:4;23182:81;23051:222;22386:887;;22416:618;22468:4;22464:9;22456:6;22452:22;22502:37;22534:4;22502:37;:::i;:::-;22561:1;22575:208;22589:7;22586:1;22583:14;22575:208;;;22668:9;22663:3;22659:19;22653:26;22645:6;22638:42;22719:1;22711:6;22707:14;22697:24;;22766:2;22755:9;22751:18;22738:31;;22612:4;22609:1;22605:12;22600:17;;22575:208;;;22811:6;22802:7;22799:19;22796:179;;;22869:9;22864:3;22860:19;22854:26;22912:48;22954:4;22946:6;22942:17;22931:9;22912:48;:::i;:::-;22904:6;22897:64;22819:156;22796:179;23021:1;23017;23009:6;23005:14;23001:22;22995:4;22988:36;22423:611;;;22386:887;;21976:1303;;;21884:1395;;:::o;23285:180::-;23425:32;23421:1;23413:6;23409:14;23402:56;23285:180;:::o;23471:366::-;23613:3;23634:67;23698:2;23693:3;23634:67;:::i;:::-;23627:74;;23710:93;23799:3;23710:93;:::i;:::-;23828:2;23823:3;23819:12;23812:19;;23471:366;;;:::o;23843:419::-;24009:4;24047:2;24036:9;24032:18;24024:26;;24096:9;24090:4;24086:20;24082:1;24071:9;24067:17;24060:47;24124:131;24250:4;24124:131;:::i;:::-;24116:139;;23843:419;;;:::o;24268:194::-;24308:4;24328:20;24346:1;24328:20;:::i;:::-;24323:25;;24362:20;24380:1;24362:20;:::i;:::-;24357:25;;24406:1;24403;24399:9;24391:17;;24430:1;24424:4;24421:11;24418:37;;;24435:18;;:::i;:::-;24418:37;24268:194;;;;:::o;24468:348::-;24508:7;24531:20;24549:1;24531:20;:::i;:::-;24526:25;;24565:20;24583:1;24565:20;:::i;:::-;24560:25;;24753:1;24685:66;24681:74;24678:1;24675:81;24670:1;24663:9;24656:17;24652:105;24649:131;;;24760:18;;:::i;:::-;24649:131;24808:1;24805;24801:9;24790:20;;24468:348;;;;:::o;24822:169::-;24962:21;24958:1;24950:6;24946:14;24939:45;24822:169;:::o;24997:366::-;25139:3;25160:67;25224:2;25219:3;25160:67;:::i;:::-;25153:74;;25236:93;25325:3;25236:93;:::i;:::-;25354:2;25349:3;25345:12;25338:19;;24997:366;;;:::o;25369:419::-;25535:4;25573:2;25562:9;25558:18;25550:26;;25622:9;25616:4;25612:20;25608:1;25597:9;25593:17;25586:47;25650:131;25776:4;25650:131;:::i;:::-;25642:139;;25369:419;;;:::o;25794:163::-;25934:15;25930:1;25922:6;25918:14;25911:39;25794:163;:::o;25963:366::-;26105:3;26126:67;26190:2;26185:3;26126:67;:::i;:::-;26119:74;;26202:93;26291:3;26202:93;:::i;:::-;26320:2;26315:3;26311:12;26304:19;;25963:366;;;:::o;26335:419::-;26501:4;26539:2;26528:9;26524:18;26516:26;;26588:9;26582:4;26578:20;26574:1;26563:9;26559:17;26552:47;26616:131;26742:4;26616:131;:::i;:::-;26608:139;;26335:419;;;:::o;26760:233::-;26900:34;26896:1;26888:6;26884:14;26877:58;26969:16;26964:2;26956:6;26952:15;26945:41;26760:233;:::o;26999:366::-;27141:3;27162:67;27226:2;27221:3;27162:67;:::i;:::-;27155:74;;27238:93;27327:3;27238:93;:::i;:::-;27356:2;27351:3;27347:12;27340:19;;26999:366;;;:::o;27371:419::-;27537:4;27575:2;27564:9;27560:18;27552:26;;27624:9;27618:4;27614:20;27610:1;27599:9;27595:17;27588:47;27652:131;27778:4;27652:131;:::i;:::-;27644:139;;27371:419;;;:::o;27796:245::-;27936:34;27932:1;27924:6;27920:14;27913:58;28005:28;28000:2;27992:6;27988:15;27981:53;27796:245;:::o;28047:366::-;28189:3;28210:67;28274:2;28269:3;28210:67;:::i;:::-;28203:74;;28286:93;28375:3;28286:93;:::i;:::-;28404:2;28399:3;28395:12;28388:19;;28047:366;;;:::o;28419:419::-;28585:4;28623:2;28612:9;28608:18;28600:26;;28672:9;28666:4;28662:20;28658:1;28647:9;28643:17;28636:47;28700:131;28826:4;28700:131;:::i;:::-;28692:139;;28419:419;;;:::o;28844:170::-;28984:22;28980:1;28972:6;28968:14;28961:46;28844:170;:::o;29020:366::-;29162:3;29183:67;29247:2;29242:3;29183:67;:::i;:::-;29176:74;;29259:93;29348:3;29259:93;:::i;:::-;29377:2;29372:3;29368:12;29361:19;;29020:366;;;:::o;29392:419::-;29558:4;29596:2;29585:9;29581:18;29573:26;;29645:9;29639:4;29635:20;29631:1;29620:9;29616:17;29609:47;29673:131;29799:4;29673:131;:::i;:::-;29665:139;;29392:419;;;:::o;29817:165::-;29957:17;29953:1;29945:6;29941:14;29934:41;29817:165;:::o;29988:366::-;30130:3;30151:67;30215:2;30210:3;30151:67;:::i;:::-;30144:74;;30227:93;30316:3;30227:93;:::i;:::-;30345:2;30340:3;30336:12;30329:19;;29988:366;;;:::o;30360:419::-;30526:4;30564:2;30553:9;30549:18;30541:26;;30613:9;30607:4;30603:20;30599:1;30588:9;30584:17;30577:47;30641:131;30767:4;30641:131;:::i;:::-;30633:139;;30360:419;;;:::o;30785:148::-;30887:11;30924:3;30909:18;;30785:148;;;;:::o;30963:874::-;31066:3;31103:5;31097:12;31132:36;31158:9;31132:36;:::i;:::-;31184:89;31266:6;31261:3;31184:89;:::i;:::-;31177:96;;31304:1;31293:9;31289:17;31320:1;31315:166;;;;31495:1;31490:341;;;;31282:549;;31315:166;31399:4;31395:9;31384;31380:25;31375:3;31368:38;31461:6;31454:14;31447:22;31439:6;31435:35;31430:3;31426:45;31419:52;;31315:166;;31490:341;31557:38;31589:5;31557:38;:::i;:::-;31617:1;31631:154;31645:6;31642:1;31639:13;31631:154;;;31719:7;31713:14;31709:1;31704:3;31700:11;31693:35;31769:1;31760:7;31756:15;31745:26;;31667:4;31664:1;31660:12;31655:17;;31631:154;;;31814:6;31809:3;31805:16;31798:23;;31497:334;;31282:549;;31070:767;;30963:874;;;;:::o;31843:390::-;31949:3;31977:39;32010:5;31977:39;:::i;:::-;32032:89;32114:6;32109:3;32032:89;:::i;:::-;32025:96;;32130:65;32188:6;32183:3;32176:4;32169:5;32165:16;32130:65;:::i;:::-;32220:6;32215:3;32211:16;32204:23;;31953:280;31843:390;;;;:::o;32239:429::-;32416:3;32438:92;32526:3;32517:6;32438:92;:::i;:::-;32431:99;;32547:95;32638:3;32629:6;32547:95;:::i;:::-;32540:102;;32659:3;32652:10;;32239:429;;;;;:::o;32674:225::-;32814:34;32810:1;32802:6;32798:14;32791:58;32883:8;32878:2;32870:6;32866:15;32859:33;32674:225;:::o;32905:366::-;33047:3;33068:67;33132:2;33127:3;33068:67;:::i;:::-;33061:74;;33144:93;33233:3;33144:93;:::i;:::-;33262:2;33257:3;33253:12;33246:19;;32905:366;;;:::o;33277:419::-;33443:4;33481:2;33470:9;33466:18;33458:26;;33530:9;33524:4;33520:20;33516:1;33505:9;33501:17;33494:47;33558:131;33684:4;33558:131;:::i;:::-;33550:139;;33277:419;;;:::o;33702:182::-;33842:34;33838:1;33830:6;33826:14;33819:58;33702:182;:::o;33890:366::-;34032:3;34053:67;34117:2;34112:3;34053:67;:::i;:::-;34046:74;;34129:93;34218:3;34129:93;:::i;:::-;34247:2;34242:3;34238:12;34231:19;;33890:366;;;:::o;34262:419::-;34428:4;34466:2;34455:9;34451:18;34443:26;;34515:9;34509:4;34505:20;34501:1;34490:9;34486:17;34479:47;34543:131;34669:4;34543:131;:::i;:::-;34535:139;;34262:419;;;:::o;34687:233::-;34726:3;34749:24;34767:5;34749:24;:::i;:::-;34740:33;;34795:66;34788:5;34785:77;34782:103;;34865:18;;:::i;:::-;34782:103;34912:1;34905:5;34901:13;34894:20;;34687:233;;;:::o;34926:180::-;34974:77;34971:1;34964:88;35071:4;35068:1;35061:15;35095:4;35092:1;35085:15;35112:185;35152:1;35169:20;35187:1;35169:20;:::i;:::-;35164:25;;35203:20;35221:1;35203:20;:::i;:::-;35198:25;;35242:1;35232:35;;35247:18;;:::i;:::-;35232:35;35289:1;35286;35282:9;35277:14;;35112:185;;;;:::o;35303:176::-;35335:1;35352:20;35370:1;35352:20;:::i;:::-;35347:25;;35386:20;35404:1;35386:20;:::i;:::-;35381:25;;35425:1;35415:35;;35430:18;;:::i;:::-;35415:35;35471:1;35468;35464:9;35459:14;;35303:176;;;;:::o;35485:180::-;35533:77;35530:1;35523:88;35630:4;35627:1;35620:15;35654:4;35651:1;35644:15;35671:98;35722:6;35756:5;35750:12;35740:22;;35671:98;;;:::o;35775:168::-;35858:11;35892:6;35887:3;35880:19;35932:4;35927:3;35923:14;35908:29;;35775:168;;;;:::o;35949:373::-;36035:3;36063:38;36095:5;36063:38;:::i;:::-;36117:70;36180:6;36175:3;36117:70;:::i;:::-;36110:77;;36196:65;36254:6;36249:3;36242:4;36235:5;36231:16;36196:65;:::i;:::-;36286:29;36308:6;36286:29;:::i;:::-;36281:3;36277:39;36270:46;;36039:283;35949:373;;;;:::o;36328:640::-;36523:4;36561:3;36550:9;36546:19;36538:27;;36575:71;36643:1;36632:9;36628:17;36619:6;36575:71;:::i;:::-;36656:72;36724:2;36713:9;36709:18;36700:6;36656:72;:::i;:::-;36738;36806:2;36795:9;36791:18;36782:6;36738:72;:::i;:::-;36857:9;36851:4;36847:20;36842:2;36831:9;36827:18;36820:48;36885:76;36956:4;36947:6;36885:76;:::i;:::-;36877:84;;36328:640;;;;;;;:::o;36974:141::-;37030:5;37061:6;37055:13;37046:22;;37077:32;37103:5;37077:32;:::i;:::-;36974:141;;;;:::o;37121:349::-;37190:6;37239:2;37227:9;37218:7;37214:23;37210:32;37207:119;;;37245:79;;:::i;:::-;37207:119;37365:1;37390:63;37445:7;37436:6;37425:9;37421:22;37390:63;:::i;:::-;37380:73;;37336:127;37121:349;;;;:::o
Swarm Source
ipfs://6e52bb806055b7069bc3ecd1e7765aba7caccea0f098f65906eecef36adb499a
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.